测试并在样品游乐场上工作。
import UIKit
protocol MyDelegate {
func delegatedFunction(a: String)
}
class DelegatorClass {
var delegate: MyDelegate?
func callDelegate() {
delegate?.delegatedFunction("Hello World!")
}
}
class DelegateClass: MyDelegate {
let my_class = DelegatorClass()
init() {
my_class.delegate = self
}
// MyDelegate Protocol implementation
func delegatedFunction(a: String) {
print(a)
}
}
要测试它,请在下面添加以下几行。
let c = DelegateClass()
c.my_class.callDelegate()
讲解,
当您创建DelegateClass c
的实例,它被初始化,执行init
方法。 DelegatorClass实例my_class
成员delegate
现在持有对DelegateClass的self
的引用。
现在执行callDelegate()
方法时,由于在可选变量delegate
现在保持对所述DelegateClass实例的引用,它基本上要求在它的delegatedFunction(a: String)
方法的执行。因此,打印字符串a
。
另请注意,我必须将my_class.delegate = self
放在init()
之内的原因是因为您只能在类的方法之外拥有实例属性声明。所有的功能应该进入方法。
希望解释清楚! :)
您需要分配
self
到delegate
财产的重要性在继续调用之前将变量“委托”与DelegateClass相关联。在这种情况下,您将调用一个函数,而不是一个运行时错误的零值! – kandelvijaya委托与基于接口的对象组合类似。这是解耦对象和责任的一种方式。如果您阅读设计模式的Head First的前三章,您可能会更好地欣赏它。 – kandelvijaya