[英]Can i sort a Array in Swift with custom logic for sorting
我已经经历了几乎所有关于stackoverflow的问题,关于它在哪里回答
array.sort({
$0.name < $1.name
})
但是我一点都不想要...
我有包含自定义对象的数组,我想按照变量名称状态之一对其进行排序...但不是升序或降序...排序取决于状态...
这是等效的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中做同样的事情。 在将其标记为重复之前,请先阅读整个问题。
Swift的等效项是
dataArray.sortInPlace {
return allStatus.indexOf($0.status)! < allStatus.indexOf($1.status)!
}
allStatus
数组可以在sort闭包中以及在全局范围内的某个地方或在本地范围内的闭包之前声明。
在Swift中,最好将allStatus
内容声明为具有Int
原始值类型的enum
类型,并将自定义类中的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
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"]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.