在Swift中,如果我创建一个委托协议,它可以通过类和结构符合.
protocol MyDelegate { // Can be conformed to by class or struct }
当我宣布代表时,问题出现了.如果委托是一个类实例,我希望变量是弱的,以避免保留循环.如果它是一个结构,就没有这样的需求 - 实际上,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 { }
似乎我们需要在任何时候都将这个协议声明为类,因为非常规委托协议无法阻止保留周期:
protocol MyDelegate: class { }
Swift允许你以这种方式射击自己的事实似乎违背了其安全设计理念.