2017-01-15 4 views
-1

私が理解できないこのスウィフトコードを発見しました。 navigationCallbackには何が割り当てられていますか? [unowned self]とは何ですか? Objective-Cの同等の例を見ることができれば、これをよりよく理解できると思います。これはSwiftコードでは何ですか?

navigationCallback = { [unowned self] in 
    previousNavigationCallback?() 
    if self.state != .Canceled { 
     callback() 
    } 
} 
+4

閉鎖内の自己への弱い参照と強い参照。公式文書を読んだことはありますか? https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html –

+0

これは、いわゆる「キャプチャ」リストで、「自己」が「所有されていない」参照として扱われることを指定するために使用されますその閉鎖の中に私はあなたが必要な場合はそれを拡張することができますが、公式の文書はそれをかなりうまくカバーします – Maiaux

+0

あなたはこれもGoogleでしたか? – Alexander

答えて

5

navigationCallbackはに何を割り当てられていますか?

中括弧の中身は、無名関数を構成します。これはObjective-Cのblockのようなものです。

[unowned self]とは何ですか?

匿名機能のキャプチャリストにあるinに先行する大括弧で囲まれたものです。これは、保持されていない関数にselfを持ち込むことによって保持サイクルを防止します。 unownedはObjective-Cのassignプロパティポリシー(非ARC weak)に似ています。 Objective-Cでは、同様のことを行うために通常weak-strong danceを実行します。

+0

ああ、大丈夫です。これは今や意味をなさないようになっています。したがって、 '' unowned self ''の目的は、 '' self''が無名関数で参照されるため、 '' weak''参照を定義することです。それは無名関数ですか? – Andrew

3

この構造体は「キャプチャリスト」と呼ばれます。 Mattが言っているように、クロージャー/ブロック/無名関数はブロック内の自己への所有されていない参照を持つことができます。作成中のオブジェクトにもクロージャに対する強い参照がある場合、オブジェクトを作成するオブジェクトへの強い参照を持つクロージャによって引き起こされる保持サイクルを避けることができます。

これはAppleのSwift iBookで詳しく説明されています。

あなたはクロージャの定義の一部としてキャプチャリストを定義 により閉鎖し、クラスのインスタンスとの間に強い

基準周期を解決クロージャのための強い参照サイクルの解決:ここでは簡単な抜粋です。キャプチャ リストは、クロージャの本体内に1つまたは複数の参照 タイプをキャプチャするときに使用するルールを定義します。 2つのクラスインスタンス間の強い参照サイクル の場合と同様に、キャプチャされた各参照は、強い参照ではなく弱いまたは所有されていない参照 であると宣言します。 弱いまたは無所有の適切な選択は、コードの異なる部分の間の関係 によって異なります。

抜粋:アップル社の "Swift Programming Language(Swift 2)" iBooks。 https://itun.es/us/jEUH0.l

関連する問題