並べ替えのプロセスを視覚化できますか?Swiftの配列ソートの理解方法
let numbers = [0,2,1]
let sortedNumbers = numbers.sorted { $0 > $1 }
私は現実の生活の中で降順にこれらの3つの数字を並べ替えるとしたら、それはこのことになるに:scrSh1が、スウィフトは、それが複雑になり:scrSh2。
どのように4回の返品があり、最後の1回が「偽」ですか? 引数$ 0と$ 1の位置はどのように変わりますか?
並べ替えのプロセスを視覚化できますか?Swiftの配列ソートの理解方法
let numbers = [0,2,1]
let sortedNumbers = numbers.sorted { $0 > $1 }
私は現実の生活の中で降順にこれらの3つの数字を並べ替えるとしたら、それはこのことになるに:scrSh1が、スウィフトは、それが複雑になり:scrSh2。
どのように4回の返品があり、最後の1回が「偽」ですか? 引数$ 0と$ 1の位置はどのように変わりますか?
遊び場でこのようなファイル名を指定して実行して、そしてあなたはそれがより詳細にどのように動作するか表示されます。
let numbers = [0,2,1]
let sortedNumbers = numbers.sorted {
print("0: \($0), 1: \($1), returning \($0 > $1)")
return $0 > $1
}
$ 0が単に最初の引数で、$ 1が第二です。あなたの数字の配列があると、出力:
0: 2, 1: 0, returning true
0: 1, 1: 0, returning true
0: 1, 1: 2, returning false
ありがとう!それは私を助けるだろう。 – PigeonPO
sorted
関数は、任意の2つの要素の順序を定義するクロージャを使用します。ソートアルゴリズムはアイテム間の一連の比較を行い、クロージャを使用してクロージャを使用してそれらの間の順序を決定します。
ここ番号の例配列の選別において行われたすべての比較を出力例は次のとおり
let numbers = [0, 9, 1, 8, 2, 7, 3, 6, 4, 5]
let sorted = numbers.sorted { (a: Int, b: Int) -> Bool in
let result = a < b
print("\(a) is \(result ? "" : "not") before \(b)")
return result
}
print(sorted)
$0
と$1
は暗黙閉鎖パラメータあります。それらは暗黙のうちにクロージャのパラメータに与えられた名前です。これらは、クロージャのパラメータに与えられた名前が、この場合のようにむしろ任意の場合によく使用されます。あなたはleftElement
とrightElement
は、暗黙的に使用することが好ましいている理由である、コードに多くの情報を追加しない見ることができるように
let numbers = [0,2,1]
let sortedNumbers = numbers.sorted { leftElement, rightElement in
return leftElement > rightElement
}
:それはそうのようなものだったかのように、あなたの例では
、閉鎖は動作しますこのような場合のクロージャパラメータ
ザ・「(4回)」({ $0 > $1 }
)あなたの閉鎖を意味はsorted
機能によって4回呼び出さなっています。
false
の意味はわかりませんが、sorted
(例:David Shawの方法で視覚化することができます)の内部ソートアルゴリズムに完全に依存しています。私。 $0
および$1
は、ではなく、 "位置を変更する"です。
それはまもなくなく、包括的documentationで説明しています:
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
...reversedNames = names.sorted(by: { s1, s2 in s1 > s2 })
速記引数名
スウィフトが自動的 クロージャをインライン化する速記引数名を提供し、これはクロージャのの値を参照するために使用できます引数を
$0
,$1
,$2
などのように指定します。あなたが閉鎖 式の中でこれらの速記引数名を使用する場合はは、あなたがその 定義からクロージャの引数リストを省略することができ、そして速記引数名 の数と種類は、予想される関数の型から推測されます。ここで
reversedNames = names.sorted(by: { $0 > $1 })
、
$0
と$1
クロージャの第一および第二のString
の引数を参照してください:閉鎖式は その本体のみで構成されているためin
キーワードは も、省略することができます。
これは、使用されているソートアルゴリズムに関するものです。 2つの要素$ 0と$ 1を比較します。結果に応じてあなたを移動させます。毎回$ 0と$ 1を表示するログを追加できるはずです。 – Larme
@Larmeええ、私は各結果を印刷しようとしましたが、それは不可能だと思います。 – PigeonPO
@PigeonPOここでは、さまざまな閉鎖構文糖すべてを分解する答えがあります:http://stackoverflow.com/a/40390414/3141234 – Alexander