測試並在樣品遊樂場上工作。
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