我可以使用自定义逻辑对Swift中的数组进行排序

时间:2015-11-25 12:01:45

标签: ios objective-c arrays swift swift2

我几乎已经完成了有关它的回答的堆栈溢出问题

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中执行相同的操作。请在将其标记为重复之前阅读整个问题......它不重复

3 个答案:

答案 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