我想要这段代码的Swift版本:
NSArray *sortedNames = [names sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
答案 0 :(得分:69)
var names = [ "Alpha", "alpha", "bravo"]
var sortedNames = names.sorted { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }
更新:根据SO用户的推荐提供解释。
与ObjC不同,在Swift中你有sort()(和sort())方法,它接受你提供的一个闭包,它返回一个布尔值,指示一个元素应该在(true)之前还是之后(false)另一个元素。 $ 0和$ 1是要比较的元素。我使用localizedCaseInsensitiveCompare来获取您要查找的结果。现在,localizedCaseInsensitiveCompare返回排序类型,因此我需要修改它以返回适当的bool值。
Swift 2的更新:
sorted
和sort
替换为sort
和sortInPlace
答案 1 :(得分:20)
定义初始名称数组:
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]"
答案 2 :(得分:17)
如果您的数组不包含自定义对象(只是字符串或数字类型):
var sortedNames = sorted(names, <)
否则,如果您在其中创建包含自定义属性的自定义数据对象类:
customDataObjectArray.sort({ $0.customProperty < $1.customProperty })
答案 3 :(得分:7)
使用运算符重载是使用Swift语言对字符串进行排序的最有效方法。
// OPERATOR OVERLOADING
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
var sortedNames = sorted(names, <)
var reverseOrder = sorted(names, >)
在上面的代码>
和<
中,运算符在Swift中重载以对字符串进行排序。
我在Playground中测试了代码并得出结论,当我们使用运算符重载时,最好对字符串进行排序。
将以下内容复制到Playground。
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, >)
游乐场的结论:
从上面的图像可以看出,所有其他方法都需要枚举循环来排序5个字符串。当我们使用运算符重载时,它不需要枚举循环来对字符串进行排序。
答案 4 :(得分:4)
如果要按升序对数组进行排序,请使用以下语法:
var arrayName = sorted(arrayName, <)
因为 sorted()是swift和&lt;中的预定义函数。用于指示数组应按升序排序。如果您想按降序对数组进行排序,只需将&lt; 替换为&gt; ,如下所示:
var arrayName = sorted(arrayName, >)
答案 5 :(得分:2)
您通常可以使用内置的
func sort<T : Comparable>(inout array: [T])
但如果您想使用localizedCaseInsensitiveCompare:
,则可以使用NSArray
直接翻译您的代码。
答案 6 :(得分:2)
可以与Objective-C sortedArrayUsingSelector:
一起使用的任何方法都可以与Swift sort
(或sorted
)一起使用,前提是数组中的事物类型是已知的。所以,在你的代码中:
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}
答案 7 :(得分:1)
在Swift中 -
let students: Set = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
let sortedStudents = students.sorted()
print(sortedStudents)
// Prints "["Abena", "Akosua", "Kofi", "Kweku", "Peter"]"
要按降序对序列元素进行排序,请将大于运算符(&gt;)传递给sorted(isOrderedBefore :)方法。
let descendingStudents = students.sorted(isOrderedBefore: >)
print(descendingStudents)
// Prints "["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"