I want the Swift version of this code:
NSArray *sortedNames = [names sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
Any method that can be used with Objective-C sortedArrayUsingSelector:
can be used with Swift sort
(or sorted
) provided the type of thing in the array is known. So, in your code:
var arr : [String] = // ...
// it is an array of String, so we can use localizedCaseInsensitiveCompare:
sort(&arr) {return $0.localizedCaseInsensitiveCompare($1) == .OrderedAscending}
Similarly:
var events : [EKEvent] = // ...
sort(&events) {return $0.compareStartDateWithEvent($1) == .OrderedAscending}
If you want to sort your array in ascending order then use below syntax:
var arrayName = sorted(arrayName, <)
as the sorted() is the predefined function in swift and < is used to indicate that the array should be sorted in ascending order. If you want to sort the array in descending order then simply replace < with > as I have shown below:
var arrayName = sorted(arrayName, >)
If your array does not contain Custom Objects (just a string or number type):
var sortedNames = sorted(names, <)
Otherwise if you create a Custom Data Object Class containing custom properties inside:
customDataObjectArray.sort({ $0.customProperty < $1.customProperty })
You can usually use the built-in
func sort<T : Comparable>(inout array: [T])
but if you want to use localizedCaseInsensitiveCompare:
, your code can be translated directly using NSArray
.
The use of Operator Overloading is the most efficient way to sort Strings in Swift language.
// OPERATOR OVERLOADING
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
var sortedNames = sorted(names, <)
var reverseOrder = sorted(names, >)
In above code >
and <
operators are overloaded in Swift to sort Strings.
I have test the code in Playground and conclude that when we use operator overloading it is best for sorting Strings.
Copy below to 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, >)
The conclusion from Playground:
From above image you can see that all other ways needs to enumerate loops for sorting 5 strings. Where as when we use Operator overloading it does not required to enumerate loop to sort strings.
Referenced from Swift documentation
Define a initial names array:
var names = [ "gamma", "Alpha", "alpha", "bravo"]
Method 1:
var sortedNames = sorted(names, {$0 < $1})
// sortedNames becomes "[Alpha, alpha, bravo, gamma]"
This can be further simplified to:
var sortedNames = sorted(names, <)
// ["Alpha", "alpha", "bravo", "gamma"]
var reverseSorted = sorted(names, >)
// ["gamma", "bravo", "alpha", "Alpha"]
Method 2:
names.sort(){$0 < $1}
// names become sorted as this --> "[Alpha, alpha, bravo, gamma]"