2017-05-31 9 views
0

私はアップルが提供するスウィフトドキュメントを読んだとき、私は私のためにいくつかのコンセプトが明確でないことが判明は...スワイプクロージャー省略例?

クロージャの型はすでに、このようなデリゲートのコールバックとして知られているとき、あなたはタイプを省略することができます戻り値の型、またはその両方を返します。単一ステートメントのクロージャは、唯一のステートメントの値を暗黙的に返します。

let mappedNumbers = numbers.map({ number in 3 * number }) 
print(mappedNumbers) 

それはデリゲートのコールバックを意味は何?あなたは私に例を教えていただけますか?両方を省略すると、inというキーワードが必要ですか?

答えて

1

もっと簡単なことはありません。この場合、delegateの意味は、クロージャが変数として使用されることです。次の例を考えてみましょう:

class Downloader { 
    var onDownloaded: ((Data) -> Void)? 
    func startDownloading() { 
     ... 
    } 
} 

として使用する:あなたが見ることができるように

let downloader = Downloader() 
downloader.onDownloaded = { data in 
    print("Downloaded: \(data.count) B") 
} 
downloader.startDownloading() 

が、私は、タイプまたは閉鎖で戻り値のいずれも指定していないため、式の左辺( .onDownloaded =)が提供します。

同じことがメソッドパラメータに適用されます。

func startDownloading(onDownloaded: ((Data) -> Void)?) { 
    ... 
} 

はしかし、我々はまだ閉鎖にinを必要としています。キーワードは、クロージャー本体からパラメーター名を区切ります。もちろん、パラメータを匿名にすることができます。

downloader.onDownloaded = { 
    print("Downloaded: \($0.count) B") 
} 
+0

'ダウンローダ。'Bool **型の変数は使用されていないため、省略することもできますか?コンパイラは 'data'がタイプ** Data **であることを知っていますか? – user7813604

+1

@ user7813604ああ、私のせい、すみません。 '_、data in'を使用して明示的に省略する必要があります:) – Sulthan

1

パラメータタイプがデリゲートから推測できると記載されています。デリゲートはプロトコルで、メソッドパラメータの型を定義します。これは、デリゲートメソッドを実装するときに、コンパイラは宣言されたプロトコルを通じてメソッドタイプについて既に認識していることを意味します。

例:

let sortedAnimals = animals.sort { (one: String, two: String) -> Bool in 
    return one < two 
} 

最初の簡略化パラメータに関連しています。戻り値の型も推論することができる

let sortedAnimals = animals.sort { (one, two) -> Bool in return one < two } 

let sortedAnimals = animals.sort { (one, two) in return one < two } 

$ I表記はパラメータ名置き換えることができます:

を型推論システムは、クロージャ内のパラメータの種類を計算することができます単一の文の閉鎖で
let sortedAnimals = animals.sort { return $0 < $1 } 

、returnキーワードを省略することができます。

文字列の0

、文字列比較がさらに短くなり、比較機能があります:

let sortedAnimals = animals.sort(<) 

各ステップには、同じ結果を出力し、あなたが簡潔であるかを決定することがあるが、同時に読めます。

+0

' animals.sort() 'の括弧を省略しましたか? – user7813604