Sorting 使用SorterDarray使用比较器对NSArray进行排序
在Sorting 使用SorterDarray使用比较器对NSArray进行排序,sorting,swift,nsarray,Sorting,Swift,Nsarray,在Objective-C中,我可以使用以下语句对NSArray进行排序: NSArray *sortedArray = [persons sortedArrayUsingComparator:^NSComparisonResult(Person *p1, Person *p2) { return [p1.name compare:p2.name]; }]; 我无法用Swift复制相同的语句。我发现的只是使用数组,所以试着用Swift写同样的东西: var sortedArray:NSA
Objective-C
中,我可以使用以下语句对NSArray
进行排序:
NSArray *sortedArray = [persons sortedArrayUsingComparator:^NSComparisonResult(Person *p1, Person *p2) {
return [p1.name compare:p2.name];
}];
我无法用Swift复制相同的语句。我发现的只是使用
数组
,所以试着用Swift写同样的东西:
var sortedArray:NSArray =
persons.sortedArrayUsingComparator(){(p1:AnyObject!, p2:AnyObject!) -> NSComparisonResult in
if (p1 as Person).name > (p2 as Person).name {
return NSComparisonResult.OrderedDescending
}
if (p1 as Person).name < (p2 as Person).name {
return NSComparisonResult.OrderedAscending
}
return NSComparisonResult.OrderedAscending
}
您可以使用或,因为Swift数组桥接到NSArray
,所以您可以直接从Swift使用比较器调用sortedarray
使用Swift的排序功能:
var sortedArray = sorted(persons) {
(obj1, obj2) in
// The downcast to Person is only needed if persons is an NSArray or a Swift Array of AnyObjects
let p1 = obj1 as Person
let p2 = obj2 as Person
return p1.name < p2.name
}
没有必要避免使用Swift数组
它通过NSArray
在两个方向上桥接,因此,要获得更多类型安全的代码,最好只在需要与ObjC api互操作时使用Swift数组和桥接。(在大多数导入的API中,Swift会自动将NSArray
转换为[AnyObject]
,因此您甚至不需要经常桥接。)
假设persons
数组是从其他API获得的[AnyObject]
,则可以通过先转换数组来减少相对于其他答案的类型转换量:
let sortedPersons = sorted(persons as [Person]) { $0.name < $1.name }
// sortedPersons has inferred type [Person]
(如果persons
来自ObjC API,则可能不需要使用persons as NSArray
部分。)
根据Person
类的实现方式,使用描述符进行排序可以在后端产生更高效的排序。例如,如果它是一个核心数据管理对象,那么使用描述符排序可能会生成一个SQL查询,该查询在数据库中执行得很快,并且占用的内存很少,而使用比较器闭包排序则需要实例化数据库中的每个对象,以便对每个对象的闭包进行评估。在Swift中,您可以使用新的方法。尝试使用排序方法,而不是像这样使用比较器进行排序
var sortedArray = results.sorted {
(obj1, obj2) -> Bool in
return obj1.count! > obj2.count!
}
如果您有自定义对象并希望按日期排序
let sortedArray = self.posts.sorted {
(obj1, obj2) -> Bool in
return (obj1 as! PostModel).orderCancellionDate.compare( (obj2 as! PostModel).orderCancellionDate) == .orderedDescending
}
非常感谢@rickster。这对我很有用。NSComparisonResult
现在是ComparisonResult
。
let sortedPersons = sorted(persons as [Person]) { $0.name < $1.name }
// sortedPersons has inferred type [Person]
let sortedPersons = (persons as NSArray).sortedArrayUsingDescriptors([
NSSortDescriptor(key: "name", ascending: true)
])
var sortedArray = results.sorted {
(obj1, obj2) -> Bool in
return obj1.count! > obj2.count!
}
let sortedArray = self.posts.sorted {
(obj1, obj2) -> Bool in
return (obj1 as! PostModel).orderCancellionDate.compare( (obj2 as! PostModel).orderCancellionDate) == .orderedDescending
}