如何在Swift中对数组进行sorting

我想要这个代码的Swift版本:

NSArray *sortedNames = [names sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
 var names = [ "Alpha", "alpha", "bravo"] var sortedNames = names.sorted { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending } 

更新:根据SO用户的build议提供解释。

与ObjC不同的是,在Swift中,你有sort()(和sort())方法,它接受一个你提供的闭包,返回一个布尔值来表示一个元素应该在另一个元素之前(true)还是之后(false)。 $ 0和$ 1是要比较的元素。 我使用localizedCaseInsensitiveCompare来获得你正在寻找的结果。 现在,localizedCaseInsensitiveCompare返回sorting的types,所以我需要修改它以返回适当的布尔值。

Swift 2的更新: sortedsortsortsortInPlacereplace

在Swift中对数组进行sorting

定义一个初始名称数组:

 var names = [ "gamma", "Alpha", "alpha", "bravo"] 

方法1:

 var sortedNames = sorted(names, {$0 < $1}) // sortedNames becomes "[Alpha, alpha, bravo, gamma]" 

这可以进一步简化为:

 var sortedNames = sorted(names, <) // ["Alpha", "alpha", "bravo", "gamma"] var reverseSorted = sorted(names, >) // ["gamma", "bravo", "alpha", "Alpha"] 

方法2:

 names.sort(){$0 < $1} // names become sorted as this --> "[Alpha, alpha, bravo, gamma]" 

如果你的数组不包含自定义对象(只是一个string或数字types):

 var sortedNames = sorted(names, <) 

否则,如果在里面创build一个包含自定义属性的自定义数据对象类

 customDataObjectArray.sort({ $0.customProperty < $1.customProperty }) 

SWIFT中最有效的sorting方式

运算符重载是使用Swift语言对Strings进行sorting的最有效的方法。

 // OPERATOR OVERLOADING let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] var sortedNames = sorted(names, <) var reverseOrder = sorted(names, >) 

在上面的代码中><运算符在Swift中重载以对string进行sorting。

我已经testing了Playground中的代码,并得出结论,当我们使用运算符重载时,最好是对string进行sorting。

复制到游乐场。

 let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] var reversed = sorted (names, // This is a closure { (s1 : String, s2 : String) -> Bool in return s1 > s2 } ) println(reversed) var reverseOrder = sorted(names, {s1, s2 in s1 > s2}) var reverseOrder2 = sorted(names, { $0 > $1} ) // OPERATOR OVERLOADING var reverseOrder3 = sorted(names, >) 

游乐场的结论:

在这里输入图像说明

从上面的图片你可以看到,所有其他的方式需要枚举循环sorting5个string。 当我们使用运算符重载时,不需要枚举循环来对string进行sorting。

Swift文档引用

如果你想按升序排列你的数组,然后使用下面的语法:

 var arrayName = sorted(arrayName, <) 

因为sorted()是swift中的预定义函数,而<用于指示数组应按升序sorting。 如果要按降序对数组进行sorting,则只需将< with >replace为如下所示:

 var arrayName = sorted(arrayName, >) 

你通常可以使用内置的

 func sort<T : Comparable>(inout array: [T]) 

但是如果你想使用localizedCaseInsensitiveCompare: ,你的代码可以直接使用NSArray进行翻译。

任何可以与Objective-C sortedArrayUsingSelector:一起使用的方法都可以与Swift sort (或sorted )一起使用,前提是数组中的事物的types是已知的。 所以,在你的代码中:

 var arr : [String] = // ... // it is an array of String, so we can use localizedCaseInsensitiveCompare: sort(&arr) {return $0.localizedCaseInsensitiveCompare($1) == .OrderedAscending} 

同理:

 var events : [EKEvent] = // ... sort(&events) {return $0.compareStartDateWithEvent($1) == .OrderedAscending} 

在Swift-

 let students: Set = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"] let sortedStudents = students.sorted() print(sortedStudents) // Prints "["Abena", "Akosua", "Kofi", "Kweku", "Peter"]" 

要按降序sorting序列的元素,请将大于运算符(>)传递给sorting的(isOrderedBefore :)方法。

 let descendingStudents = students.sorted(isOrderedBefore: >) print(descendingStudents) // Prints "["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"