gpt4 book ai didi

swift - swift Playground 中的简单 swift 委托(delegate)

转载 作者:搜寻专家 更新时间:2023-10-30 23:15:04 26 4
gpt4 key购买 nike

我对 Swift 和一般编程还很陌生,对 Fortran 77 有点了解,最近对微 Controller 进行了一些简单的编程。我正在研究基础知识,一切都很好,直到我遇到一些我无法完全掌握的东西 - 委托(delegate)。所有的在线帖子都没有完全理解这个概念,至少对我来说是这样,所以为了给自己一些我可以引用的东西,我在 Playground 上设置了一个基本模板,如下所示。如果我运行下面的代码,它会工作并向终端打印“完成的事情”,但是如果我将协议(protocol)设为“类”协议(protocol),即“协议(protocol) SomeDelegate:类 {”,并将“var delegate”设为“weak var delegate”正如各种帖子中所推荐的那样,它不起作用 - 我做错了什么?

import UIKit

protocol SomeDelegate {
func DoSomething()
}

class MyViewcontroller: UIViewController, SomeDelegate {

func DoSomething() {
print("Something done")
}

}


class OtherClass {

var delegate: SomeDelegate?


func DoSomething() {

delegate?.DoSomething()

}
}


var myVar = OtherClass()
myVar.delegate = MyViewcontroller()
myVar.DoSomething()

最佳答案

它不会打印,因为委托(delegate)在您设置后立即为 nil。原因很简单:没有实例拥有它(引用计数为零)。没有人拥有 delegate,因为您将其声明为 OtherClass 的弱属性。尝试建立所有权,例如

var myVar = OtherClass()
let viewController = MyViewController()
myVar.delegate = viewController

尽管委托(delegate)很弱,但它现在会再次打印Something done

将委托(delegate)声明为弱是有道理的,因为它可以防止循环引用导致委托(delegate)永远不会在内存中释放——尽管这是一个完全不同的故事——检查引用计数是如何工作的,然后你就会明白为什么这是一个好的做法。

关于swift - swift Playground 中的简单 swift 委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38876606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com