Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 使用SorterDarray使用比较器对NSArray进行排序_Sorting_Swift_Nsarray - Fatal编程技术网

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
        }