Swift Sort String Arrays: Closure Examples

Sort arrays with the sort method. Use funcs and closures to compare Strings and Ints.
Sort. A string array contains animal names. They come in a jumbled order: zebra, bird, cat. With sort, we organize these animals into a pattern.
With funcs, we can specify advanced comparison logic for sorting. With closures, we add logic with inline function bodies. We can even sort with a single operator.
Func example. Let us begin. This program uses a func called "before" to compare 2 strings. We call sort() with the before func name as the argument.

And: The animals array is sorted according to the logic in before. Strings are compared alphabetically.

Less than: This operator is implemented for 2 strings. With it, "A" precedes "B."

True: This is returned when the first argument comes before the second in sorted order.

Swift program that sorts array with func func before(value1: String, value2: String) -> Bool { // One string is alphabetically first. // ... True means value1 precedes value2. return value1 < value2; } var animals = ["walrus", "bird", "alligator", "zebra"] // Sort the array. animals.sort(by: before) // Display sorted array. for animal in animals { print(animal) } Output alligator bird walrus zebra
Descending, Int array. To implement a descending sort, we use a "greater than" operator. Here we also change to an Int array. We sort by the values of these integers.

Tip: The argument types in a func (one that is used for sorting) must match the array element types.

Swift program that sorts descending, Int array func descending(value1: Int, value2: Int) -> Bool { // A number precedes another if it is higher. // ... This is a descending sort. return value1 > value2; } var ids = [0, 10, 25, 100, 21, 22] ids.sort(by: descending) // Display results. for id in ids { print(id) } Output 100 25 22 21 10 0
Strings by length. Here we sort a string array based on the results of a function call. We sort on the count of characters in each string.

Result: The string array is sorted by length, from shortest (d) to longest (gggg).

Swift program that sorts strings by length func length(value1: String, value2: String) -> Bool { // Compare character count of the strings. return value1.characters.count < value2.characters.count } var values = ["yyy", "aa", "d", "gggg"] values.sort(by: length) // Display strings sorted by character count. print(values) Output ["d", "aa", "yyy", "gggg"]
Closure. A closure is an inline function block (and an environment with variables). In Swift we can pass a closure block to sort(). No separate func declaration is needed.

In: The in-keyword separates the return type from the return expression. So "Bool in" is used to return a Bool based on the comparison.

Arguments: The arguments of a closure expression can be specified in the same way as in a func.

Swift program that uses sort, closure syntax // An unordered string array. var values = ["DEF", "ABC", "XYZ", "GHI"] // Sort strings in descending alphabetical order. // ... Use closure for sort method. values.sort(by: { (value1: String, value2: String) -> Bool in return value1 > value2 }) print(values) Output ["XYZ", "GHI", "DEF", "ABC"]
Syntax. A closure can be specified with many syntax forms. Swift provides many reduced forms—these save us from typing characters. The short forms may be easier to read.

Example 1: This closure (which sorts "values") omits the Int argument type of the elements in the array.

Example 2: This closure removes the "return" keyword. Typing "return" requires six key presses.

Example 3: The special variables $0 and $1 (and further) are available in closures. These are the first, second and further arguments.

Example 4: A single character can be used to sort. We specify the < operator. We can also use > for the opposite direction.

Swift program that uses short sort syntax var values = [10, 0, 20] // Sort with short closure syntax. values.sort(by: { v1, v2 in return v1 < v2 } ) print(values) var values2 = [40, 0, 80] // The return keyword is not required. values2.sort(by: { v1, v2 in v1 < v2 } ) print(values2) var values3 = [50, 0, 90] // The special variables $0 and $1 are used. // ... These indicate the first and second arguments. values3.sort(by: { $0 < $1 } ) print(values3) var values4 = [20, 0, 40] // We can use ascending and descending sorts with a single char. values4.sort(by: <) print(values4) Output [0, 10, 20] [0, 40, 80] [0, 50, 90] [0, 20, 40]
Sort dictionary keys. A dictionary's keys cannot be sorted in-place. A dictionary is unordered. But we can get the keys and convert this to an array and sort that.

Here: We sort the keys from our dictionary in alphabetical order. Then we loop over those keys and access the values.

Swift program that uses sort on dictionary keys // Create a dictionary. let animals = ["bird": 0, "zebra": 9, "ant": 1] // Get the array from the keys property. var copy = Array(animals.keys) // Sort from low to high (alphabetical order). copy.sort(by: <) // Loop over sorted keys. for key in copy { // Get value for this key. if let value = animals[key] { print("Key = \(key), Value = \(value)") } } Output Key = ant, Value = 1 Key = bird, Value = 0 Key = zebra, Value = 9
A review. Sorting uses a func that returns true or false. This func tells us whether the first element comes before the second. With funcs and closures in Swift, we simplify custom sorts.
Dot Net Perls
© 2007-2020 Sam Allen. Every person is special and unique. Send bug reports to