object-c のように、swift で自分自身への弱いポインターを作成したい
__weak Something *weakself = self;
ブロック内で「弱い自己」を使用する方法を説明している人を見つけました。
{ in [unowned self] ...}
しかし、ブロック内で「weakself」を定義したくありません。ブロックの外でweakselfを定義したいのです
weak
次のキーワードで弱参照を定義するだけです。
weak var weakSelf = self
ドキュメントから:
weak
プロパティまたは変数の宣言の前にキーワードを配置することで、弱参照を示します。
...
注: 実行時に値が変更される可能性があることを示すために、弱参照は変数として宣言する必要があります。弱参照は定数として宣言できません。
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
キャプチャ リストの作成方法を説明している 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