我几乎已经完成了有关它的回答的堆栈溢出问题
array.sort({
$0.name < $1.name
})
但我根本不想要这个......
我有包含自定义对象的Array,我想根据它的变量名称状态之一对其进行排序...但不是升序或降序...排序取决于状态...
这是等效的Objective C代码
@interface NSString (StatusComparison)
- (NSComparisonResult)statusCompare:(NSString*)otherStatus;
@end
@implementation NSString (WeekdayComparison)
- (NSComparisonResult)statusCompare:(NSString*)otherDay {
NSArray *allStatus = [NSArray arrayWithObjects:@"Immediate",@"Near",@"Far",@"Unknown",ENTER_IN_REGION,EXIT_REGION,START_MONITORING,FAIL,NOT_STARTED, nil];
NSUInteger selfIndex = [allStatus indexOfObject:self];
NSUInteger otherDayIndex = [allStatus indexOfObject:otherDay];
if (selfIndex < otherDayIndex) {
return NSOrderedAscending;
}
else if (selfIndex > otherDayIndex) {
return NSOrderedDescending;
} else {
return NSOrderedSame;
}
}
@end
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"status" ascending:YES selector:@selector(statusCompare:)];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
self.dataArray = [self.dataArray sortedArrayUsingDescriptors:sortDescriptors];
如何在Swift中执行相同的操作。请在将其标记为重复之前阅读整个问题......它不重复
答案 0 :(得分:3)
Swift等价物是
dataArray.sortInPlace {
return allStatus.indexOf($0.status)! < allStatus.indexOf($1.status)!
}
allStatus
数组可以在排序闭包中以及全局范围内的某个地方或在本地范围内的闭包之前声明。
在Swift中,最好将allStatus
内容声明为enum
类型,其中Int
原始值类型和自定义类中的status
属性作为枚举类型。好处是可预测的案例数量,没有潜在的选择权。
例如
enum Status : Int {
case Immediate = 0, Near, Far, Unknown, FAIL
var stringValue : String { return String(self) }
}
dataArray.sortInPlace {
return $0.status.rawValue < $1.status.rawValue
}
您仍然可以使用
获取枚举案例的字符串表示形式dataArray[0].status.stringValue
答案 1 :(得分:0)
Swift中的简单例子是:
["Near", "Immediate", "Far"].sort { (status1, status2) in
let statuses = ["Immediate", "Near", "Far", "Unknown"]
guard let index1 = statuses.indexOf(status1), index2 = statuses.indexOf(status2) else {
return false
}
return index1 < index2
} // Prints ["Immediate", "Near", "Far"]
答案 2 :(得分:-1)
array.sort({
$0.name < $1.name
})
这只是将闭包传递作为参数的简短手。您可以拥有一个包含两个参数的完整函数,您可以将其传递给此排序方法。
看看这个Swift closures