使用sortedArrayUsingComparator对NSArray进行排序

Pau*_*ues 24 sorting nsarray swift

Objective-C我可以NSArray使用此声明排序:

NSArray *sortedArray = [persons sortedArrayUsingComparator:^NSComparisonResult(Person *p1, Person *p2) {
    return [p1.name compare:p2.name];
}];
Run Code Online (Sandbox Code Playgroud)

我无法用Swift重现相同的声明.我发现的只是使用Array.

Mik*_*e S 36

您可以使用Swift的内置排序函数,或者由于Swift数组被桥接,NSArray您可以sortedArrayUsingComparator直接从swift 调用.

使用Swift的sorted功能:

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
}
Run Code Online (Sandbox Code Playgroud)

或者,使用NSArray's sortedArrayUsingComparator:

var sortedArray = persons.sortedArrayUsingComparator {
    (obj1, obj2) -> NSComparisonResult in

    let p1 = obj1 as Person
    let p2 = obj2 as Person
    let result = p1.name.compare(p2.name)
    return result
}
Run Code Online (Sandbox Code Playgroud)


ric*_*ter 14

没有必要避免使用Swift Array.

它可以在两个方向上进行桥接NSArray,因此对于更安全的代码,最好只在需要与ObjC API进行互操作时使用Swift数组和桥接.(在大多数导入的API中,Swift会自动转换NSArray[AnyObject],因此您甚至不需要经常桥接.)

假设persons数组是[AnyObject]从其他API获得的,您可以通过首先强制转换数组来减少类型转换相对于其他答案的数量:

let sortedPersons = sorted(persons as [Person]) { $0.name < $1.name }
// sortedPersons has inferred type [Person]
Run Code Online (Sandbox Code Playgroud)

此外,由于您只使用比较器块对类的特定属性进行排序Person,因此最好使用排序描述符:

let sortedPersons = (persons as NSArray).sortedArrayUsingDescriptors([
    NSSortDescriptor(key: "name", ascending: true)
])
Run Code Online (Sandbox Code Playgroud)

(persons as NSArray如果persons来自ObjC API,则可能不需要该部分.)

根据Person类的实现方式,使用描述符进行排序可以在后端生成更高效的排序.例如,如果它是一个核心数据管理对象,使用描述符进行排序可能会产生一个SQL查询,该查询在数据库中执行速度很快并且使用很少的内存,而使用比较器闭包进行排序需要从数据库中实例化每个对象,只是为了评估每个对象的闭包. .


Max*_*tin 9

所以试着用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
 }
Run Code Online (Sandbox Code Playgroud)

测试(游乐场):

class Person{
  var name:String?
}

var p1:Person = Person()
p1.name = "a"    

var p3:Person = Person()
p3.name = "c"

var p2:Person = Person()
p2.name = "b"

var persons:NSArray = [p1,p3,p2]

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
    }

for item:AnyObject in sortedArray{
    println((item as Person).name)
}
Run Code Online (Sandbox Code Playgroud)

输出:

Optional("a")
Optional("b")
Optional("c")
Run Code Online (Sandbox Code Playgroud)