我是 Swift 新手,我很难理解分配的目的self
给一位代表。部分困难源于委托似乎以两种不同的方式使用这一事实。
第一个是当特定事件发生时将消息从一个类发送到另一个类的方法,几乎就像状态管理一样。其次是使“类或结构能够将其部分职责移交给(或委托)给另一种类型的实例”,如文档 https://docs.swift.org/swift-book/LanguageGuide/Protocols.html。我有一种感觉,这两者本质上是相同的,但我只是不明白。
protocol PersonProtocol {
func getName() -> String
func getAge() -> Int
}
class Person {
var delegate: PersonProtocol?
func printName() {
if let del = delegate {
print(del.getName())
} else {
print("The delegate property is not set")
}
}
func printAge() {
if let del = delegate {
print(del.getAge())
} else {
print("The delegate property is not set")
}
}
}
class ViewController: UIViewController, PersonProtocol {
var person: Person!
override func viewDidLoad() {
person.delegate = self
person.printAge()
person.printName()
}
func getAge() -> Int {
print("view controller")
return 99
}
func getName() -> String {
return "Some name"
}
}
目的是什么person.delegate = self
在这种情况下?不是ViewController
已经要求符合PersonProtocol
没有它?
我有一种感觉,这两者本质上是相同的
第一个是第二个的特例。 “从一个类向另一个类发送消息”只是“移交部分职责”的一种特定方式。 “信息”就是“责任”
目的是什么person.delegate = self
在这种情况下?
Here, person
将其部分职责委托(即移交)给另一个对象。它通过向另一个对象发送消息来实现这一点。首先,它需要确定可以将这些职责委托给哪些对象。这是通过要求其实现的delegate
符合PersonProtocol
, as PersonProtocol
定义消息Person
即将发送。
Next, person
需要知道exactly应该将这些消息发送到哪个对象。这是什么person.delegate = self
做。请记住person
对你一无所知ViewController
直到此时。代替= self
,你可以说:
person.delegate = SomeOtherClassThatConformsToPersonProtocol()
and person
会将其消息发送到该对象,并且您的方法ViewController
不会被调用。
Isn't ViewController
已经要求符合PersonProtocol
没有它?
正确,但没有它,person
不知道应该将消息发送到哪个对象,因此,您的方法ViewController
不会被调用。
请注意,delegate
财产应声明为weak
以避免循环引用。当你这样做时person.delegate = self
,你会得到一个保留周期:self
有很强的参考意义person
, person
也有很强的参考意义self
通过delegate
财产。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)