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允许你以这种方式射击自己的事实似乎违背了其安全设计理念.
需要两个才能有一个保留周期......
如果你真的想这样做,那么为什么不省略weak并使其成为一个强有力的参考。只有当委托还维护对其委托的对象的强引用时,才会出现问题。
因此,委托的责任是确保任何相互引用都是弱引用,这应该始终是可能的,因为它MyClass是一个类,因此您始终可以声明对它的弱引用。
| 归档时间: |
|
| 查看次数: |
516 次 |
| 最近记录: |