我刚接触Swift,很难理解将self
分配给委托的目的。其中一部分困难在于,委托似乎以两种不同的方式使用。
第一种用法是在特定事件发生时从一个类发送消息到另一个类,几乎就像状态管理。 第二种是启用“将某些责任委托给另一种类型的实例的类或结构”,如文档中所述。 我感觉这两个基本上是相同的,但我还没有领会到。
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
了吗?
ViewController
是Person
类的代理,能够调用Person
的方法?这对Person
有什么价值?或者对ViewController
有什么价值? - KevvvViewController
是person
的代理,对吗?现在,Person
可以在需要名字或年龄时通知ViewController
。正如你可能已经意识到的那样,这不是Person
应该工作的方式...Person
应该知道自己的年龄和姓名,而不是询问ViewController
... 因此,你给你的类和协议取的名称是如何使用委托模式的一个很糟糕的例子。更好的例子可以在你问题中链接的文档中找到。在那里,SnakesAndLadders
在游戏开始和结束等情况下通知它的代理。 - SweeperUITableViewDelegate
通过 tableView(_:heightForRowAt:) 向其代理询问每行应该有多高。 - Sweeper