web-dev-qa-db-ja.com

Swiftブロックの外で自己に弱いポインタを作成する方法

Swiftで、self-への弱いポインタを作りたいと思っています。

 __weak Something *weakself = self;

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

    { in [unowned self] ...}

しかし、私は自分のブロック内で「弱い」を定義したくない、私はブロックの外で弱い自分を定義したい

20
user1709076

weakキーワードを使用して弱参照を定義するだけです:

weak var weakSelf = self

ドキュメント から:

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

55
Martin R

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

__weak MyType *weakSelf = self;

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

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

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

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

抜粋:Apple Inc.「The Swift Programming Language。」iBooks。 https://itun.es/us/jEUH0.l

2016年1月4日編集:

キャプチャリストの作成方法を説明するSwift本の一部を引用するには:

キャプチャリストの定義:キャプチャリストの各アイテムは、弱いまたは所有されていないキーワードとクラスインスタンスへの参照(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プログラミング言語(Swift 2)。」iBooks。 https://itun.es/us /jEUH0.l

8
Duncan C