Swift委托协议无法阻止保留周期问题

Boo*_*oon 6 delegates protocols swift swift2

在Swift中,如果我创建一个委托协议,它可以通过类和结构符合.

protocol MyDelegate {
  // Can be conformed to by class or struct
}
Run Code Online (Sandbox Code Playgroud)

当我宣布代表时,问题出现了.如果委托是一个类实例,我希望变量是弱的,以避免保留循环.如果它是一个结构,就没有这样的需求 - 实际上,Swift不允许我使委托变量变弱.注意:我知道如何创建一个弱委托,但关键问题是 - 如果你创建一个可能很弱的委托协议,除非你只使它符合类,否则你不能强制执行保留周期.

class MyClass {
  // Want weak var here to avoid cyclical reference
  // but Swift won't allow it because MyDelegate can be
  // conformed by struct as well.  Dropping weak means
  // cyclical reference cannot be prevented
  weak var delegate: MyDelegate?
}

class MyConformingClass: MyDelegate {

}

or

struct MyConformingStruct: MyDelegate {

}
Run Code Online (Sandbox Code Playgroud)

似乎我们需要在任何时候都将这个协议声明为类,因为非常规委托协议无法阻止保留周期:

protocol MyDelegate: class {

}
Run Code Online (Sandbox Code Playgroud)

Swift允许你以这种方式射击自己的事实似乎违背了其安全设计理念.

Aar*_*sen 2

需要两个才能有一个保留周期......

如果你真的想这样做,那么为什么不省略weak并使其成为一个强有力的参考。只有当委托还维护对其委托的对象的强引用时,才会出现问题。

因此,委托的责任是确保任何相互引用都是弱引用,这应该始终是可能的,因为它MyClass是一个类,因此您始终可以声明对它的弱引用。