【发布时间】:2015-09-14 21:14:57
【问题描述】:
我有一个基本问题。我正在从事一个具有许多委托模式的项目,并希望参考初始化它们的最佳方式..
以下是我对测试委托提出的一些想法:
选项 1:
失败是因为我在 super.init() 之前将委托初始化为 self
protocol MyClassDelegate {
func doSomething()
}
class MyClass {
var delegate: MyClassDelegate!
init(delegate: MyClassDelegate){
self.delegate = delegate
}
func myClassFuction(){
self.delegate.doSomething()
}
}
class ClassConformingToDelegate: NSObject, MyClassDelegate {
let myClass: MyClass
override init(){
myClass = MyClass(delegate: self) // Error because it's called before super.init
super.init()
}
func doSomething(){
//called from the delegate
}
}
选项 2:
它可以工作,但是我冒着让委托为零的风险。每次我想调用一个方法时,我是否必须运行一个“如果委托!=零”检查?有办法解决吗?以这种方式初始化委托是一种好习惯吗?
protocol MyClassDelegate {
func doSomething()
}
class MyClass {
var delegate: MyClassDelegate!
init(){
}
func myClassFuction(){
self.delegate.doSomething() // might fail if delegate is nil
}
}
class ClassConformingToDelegate: NSObject, MyClassDelegate {
let myClass: MyClass
override init(){
myClass = MyClass()
super.init()
myClass.delegate = self // works because called after super.init
}
func doSomething(){
//called from the delegate
}
}
这些只是一些想法。我只是想学习最好的方法。我愿意接受所有建议。
谢谢!!
【问题讨论】:
-
委托通常应该被声明为weak,否则你可能会遇到引用周期问题。见:en.wikipedia.org/wiki/…
-
@WolfgangSchreurs 在 Swift 中,协议也可以由结构体实现,并且结构体不能有保留循环; Swift 中的枚举也是如此。为了使变量 week 具有协议类型是不够的,协议需要一个对象约束。请参阅下面的答案。
标签: xcode cocoa delegates swift2