繁体   English   中英

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

[英]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"]
array.sort({
    $0.name < $1.name 
})

这只是将闭包作为参数传递的捷径。 您可以具有带有两个参数的完整函数,可以将其传递给此sort方法。

看看这个Swift闭包

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM