当您将 self 分配给委托时到底会发生什么?

2024-04-17

我是 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(使用前将#替换为@)

当您将 self 分配给委托时到底会发生什么? 的相关文章

随机推荐