web-dev-qa-db-ja.com

Swift Closuresでの$ 0と$ 1の意味は何ですか?

let sortedNumbers = numbers.sort { $0 > $1 }
print(sortedNumbers)

誰でも説明できますか、$0$1はswiftで何を意味しますか?

より多くのサンプル

array.forEach {
    actions.append($0)
}
52
aashish tamsya

$0は、クロージャーに渡される最初のパラメーターです。 $1は2番目のパラメーターなどです。このクロージャーは、次の短縮形です。

let sortedNumbers = numbers.sort { (firstObject, secondObject) in 
    return firstObject > secondObject
}
83
AdamPro13

これは、クロージャーに送信された短縮形の引数を表します。この例では、それを分類します。

Swift 4:

var add = { (arg1: Int, arg2: Int) -> Int in
    return arg1 + arg2
}
add = { (arg1, arg2) -> Int in
    return arg1 + arg2
}
add = { arg1, arg2 in
    arg1 + arg2
}
add = {
    $0 + $1
}

let result = add(20, 20) // 40
31
Bobby

スイフト5

あなたの例では$0$1は、Shorthand Argument Namesのクロージャーの1番目と2番目の文字列の引数です。省略形の引数名はSwiftによって自動的に提供されます。最初の引数は$0で参照でき、2番目の引数は$1で参照でき、3番目の引数は$2で参照できます。

ご存知のように、ClosureこれはLambda Functionに非常に近い=、またはSmall Anonymous Functionは、コードに渡して使用できる自己完結型の機能ブロックです。クロージャーは、他のプログラミング言語では名前が異なり、意味がわずかに異なります。これはLambda in PythonおよびKotlinまたはBlock in CおよびObjective-C

短縮引数名を使用してクロージャーがどのように機能するかを見てみましょう。

最初の例

let coffee: [String] = ["Cappuccino", "Espresso", "Latte", "Ristretto"]

1.通常の機能

func backward(_ n1: String, _ n2: String) -> Bool {
    return n1 > n2
}
var reverseOrder = coffee.sorted(by: backward)


/* RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"] */

2.クロージャー式

reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in
    return n1 > n2
})

3.インラインクロージャ式

reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in return n1 > n2 } )

4.コンテキストから型を推測する

reverseOrder = coffee.sorted(by: { n1, n2 in return n1 > n2 } )

5.単一式のクロージャからの暗黙的なリターン

reverseOrder = coffee.sorted(by: { n1, n2 in n1 > n2 } )

6.略式の引数名

reverseOrder = coffee.sorted(by: { $0 > $1 } )

/* $0 and $1 are closure’s first and second String arguments. */

7.演算子メソッド

reverseOrder = coffee.sorted(by: >)

/* RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"] */

enter image description here

2番目の例

let companies = ["bmw", "kfc", "ibm", "htc"]

略式の引数名なし:

let uppercasedCompanies = companies.map { (item) -> String in
    item.uppercased()
}

/* RESULT: ["BMW", "KFC", "IBM", "HTC"] */

略式の引数名の場合:

let uppercasedCompanies = companies.map {
    $0.uppercased()
}

/* RESULT: ["BMW", "KFC", "IBM", "HTC"] */

enter image description here

番目の例

このクロージャーの本体は短く、理解しやすいです:

let numbers: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

let filteredNumbers = numbers.filter { ($0 % 2) == 0 }

print(filteredNumbers)

/* RESULT: [2, 4, 6, 8, 10] */

お役に立てれば。

10
ARGeo

Sortの最初と2番目の引数を参照します。ここでは、sortは2つの要素を比較し、それらを並べ替えます。 Swift公式ドキュメント で詳細を調べることができます:

Swiftは、インラインクロージャーに省略形の引数名を自動的に提供します。これは、$ 0、$ 1、$ 2などの名前でクロージャーの引数の値を参照するために使用できます。

5
clemkoa

これは、省略名の引数名です。

Swiftは、インラインクロージャーに省略形の引数名を自動的に提供します。これは、$ 0、$ 1、$ 2などの名前でクロージャーの引数の値を参照するために使用できます。

クロージャー式内でこれらの短縮引数名を使用する場合、その定義からクロージャーの引数リストを省略できます。また、短縮引数名の数とタイプは、予想される関数タイプから推測されます。 inキーワードも省略できます。これは、クロージャー式が完全に本体で構成されているためです。

    reversed = names.sort( { $0 > $1 } )

ここで、$ 0と$ 1はクロージャーの最初と2番目のString引数を参照します。

@Bobbyの回答に加えて、例を追加したいと思います

var add: (Int,Int,Int)->Int
add = {
//So here the $0 is first argument $1 is second argument $3 is third argument
    return $0 + $1 + $2
//The above statement can also be written as $0 + $1 + $2 i.e is return is optional
}

let result = add(20, 30, 40) 
print(result) // Prints 90
0
BharathRao