Potter
Potter

Reputation: 865

How to sort an array in Swift

I want the Swift version of this code:

NSArray *sortedNames = [names sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

Upvotes: 46

Views: 52089

Answers (8)

Mohammed Asim
Mohammed Asim

Reputation: 2211

In Swift-

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

To sort the elements of your sequence in descending order, pass the greater-than operator (>) to the sorted(isOrderedBefore:) method.

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

Upvotes: 1

Chetan Purohit
Chetan Purohit

Reputation: 392

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, >)

Upvotes: 4

MirekE
MirekE

Reputation: 11555

var names = [ "Alpha", "alpha", "bravo"]
var sortedNames = names.sorted { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }

Update: Providing explanation as per recommendation of a fellow SO user.

Unlike ObjC, in Swift you have sorted() (and sort()) method that takes a closure that you supply that returns a Boolean value to indicate whether one element should be before (true) or after (false) another element. The $0 and $1 are the elements to compare. I used the localizedCaseInsensitiveCompare to get the result you are looking for. Now, localizedCaseInsensitiveCompare returns the type of ordering, so I needed to modify it to return the appropriate bool value.

Update for Swift 2: sorted and sort were replaced by sort and sortInPlace

Upvotes: 73

Selva
Selva

Reputation: 2113

Sorting an Array in Swift

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]"

Upvotes: 22

Mehul Patel
Mehul Patel

Reputation: 23053

Most efficient way of sorting in SWIFT

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:

enter image description here

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

Upvotes: 7

ericgu
ericgu

Reputation: 2249

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 })

Upvotes: 17

matt
matt

Reputation: 535944

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}

Upvotes: 2

jtbandes
jtbandes

Reputation: 118761

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.

Upvotes: 2

Related Questions