22

object-c のように、swift で自分自身への弱いポインターを作成したい

 __weak Something *weakself = self;

ブロック内で「弱い自己」を使用する方法を説明している人を見つけました。

    { in [unowned self] ...}

しかし、ブロック内で「weakself」を定義したくありません。ブロックの外でweakselfを定義したいのです

4

2 に答える 2

63

weak次のキーワードで弱参照を定義するだけです。

weak var weakSelf = self

ドキュメントから:

weakプロパティまたは変数の宣言の前にキーワードを配置することで、弱参照を示します。
...
注: 実行時に値が変更される可能性があることを示すために、弱参照は変数として宣言する必要があります。弱参照は定数として宣言できません。

于 2015-04-19T21:19:57.813 に答える
9

Objective-C で行うように、ブロックを使用して保持サイクルを回避しようとしているように思えます。自己を参照する代わりに、弱いバージョンを作成します。

__weak MyType *weakSelf = self;

void (^aBlock)() = ^void()
{
   [weakSelf doStuff];
}

これは、Swift がこの問題を処理する方法ではありません。

代わりに、キャプチャ リストの概念があり、ブロック キャプチャを参照するコンパイラと、それに対して何をすべきかを伝えます。Swift Programming Reference book で「Capture List」を検索し、その件名を読んでください。本を引用するには:

「クロージャーをクラス インスタンスのプロパティに割り当て、クロージャーがインスタンスまたはそのメンバーを参照してそのインスタンスをキャプチャすると、クロージャーとインスタンスの間に強い参照サイクルが作成されます。Swift はキャプチャ リストを使用して、これらの強力な参照サイクルを断ち切ります。詳細については、閉鎖の強力な参照サイクルを参照してください。」</p>

抜粋: Apple Inc.「The Swift Programming Language」。アイブック。https://itun.es/us/jEUH0.l

2016 年 1 月 4 日編集:

キャプチャ リストの作成方法を説明している Swift book の一部を引用するには、次のようにします。

キャプチャ リストの定義: キャプチャ リストの各項目は、weak または unowned キーワードと、クラス インスタンス (self など) または値で初期化された変数 (delegate = self.delegate! など) への参照のペアです。これらのペアリングは、コンマで区切られた 1 対の角括弧内に記述されます。

キャプチャ リストをクロージャのパラメータ リストの前に配置し、型が提供されている場合は型を返します。

lazy var someClosure: (Int, String) -> String = 
{
    [unowned self, weak delegate = self.delegate!] 
    (index: Int, stringToProcess: String) -> String in
    // closure body goes here
}

抜粋: Apple Inc.「The Swift Programming Language (Swift 2)」。アイブック。https://itun.es/us/jEUH0.l

于 2015-04-19T21:53:00.283 に答える