NSBlogger

意識高いブログ

SwiftでArrayの中身を昇順・降順でソートする

Sort関数

「Sort」を使えば簡単に配列の中身を並び替えられます。

昇順

var numbers = [1,4,2,3,6,5]

sort(numbers)

numbers // [1,2,3,4,5,6]

そのままsortで配列を引数に与えてあげればOK。
引数の中身がソートされ、上書きされます。

var strings = ["a", "e", "d", "b", "c"]

sort(strings)

strings  // ["a", "b", "c", "d", "e"]

文字列もこの通り。

降順

下記で降順に並び替えられます

numbers = [1,4,2,3,6,5]

sort(numbers){$0 > $1}

numbers // [6,5,4,3,2,1]

クロージャを使ったSortの真面目な書き方

長々と書く

上記のようにSort関数は書けますが、実際は下記のようなクロージャを使った書き方になります。

strings = ["a", "e", "d", "b", "c"]

sort(strings){
    (str1 : String, str2 : String) -> Bool in
    return str1 > str2
}

strings // ["e", "d", "c", "b", "a"]

第一引数と第二引数を比較して、Boolを返してます。
returnの比較を逆転させればソートも逆になります。

型の省略

しかし、そもそも与えられた配列の中身を取り出して比較しているので、
引数および戻り値の型は明示的に指定しなくても推測されます。
したがって、下記のように省略が可能。

sort(strings){
    (str1, str2) in
    return str1 > str2
}

引数の型「String」と戻り値の型「Bool」を省略しました。

returnの省略

さらに、引数の()やreturnも省略できます。
今回の場合は、returnが一つに限定されているので、省略が可能。

sort(strings){ str1, str2 in str1 > str2 }

改行も除けばこのとおり、すっきりした形になります。

引数を$0, $1, ... に

そして、自分自身を引数としてとる場合、「str1」「str2」は「$0」「$1」などで置き換えることが可能です。

sort(strings){$0 > $1}

どうやら、「$0」や「$1」を使うときは「in」を省略できるようです。
めでたく、最初に書いた短いコードに辿りつけました。