gpt4 book ai didi

xcode - 何时在 Swift 中初始化委托(delegate)

转载 作者:行者123 更新时间:2023-12-03 16:04:09 25 4
gpt4 key购买 nike

我有一个基本问题。我正在开发一个具有许多委托(delegate)模式的项目,并且希望引用初始化它们的最佳方法。

以下是我与测试委托(delegate)提出的一些想法:

选项 1:

它失败了,因为我在 super.init() 之前初始化了 self 的委托(delegate)

protocol MyClassDelegate {
func doSomething()
}

class MyClass {

var delegate: MyClassDelegate!

init(delegate: MyClassDelegate){
self.delegate = delegate
}

func myClassFuction(){
self.delegate.doSomething()
}
}


class ClassConformingToDelegate: NSObject, MyClassDelegate {

let myClass: MyClass

override init(){
myClass = MyClass(delegate: self) // Error because it's called before super.init
super.init()
}

func doSomething(){
//called from the delegate
}
}

选项 2:

它可以工作,但是我会冒委托(delegate)为零的风险。每次我想调用一个方法时,我是否都必须运行“if delegate != nil”检查?有办法解决这个问题吗?以这种方式初始化委托(delegate)是一个好的做法吗?

protocol MyClassDelegate {
func doSomething()
}

class MyClass {

var delegate: MyClassDelegate!

init(){
}

func myClassFuction(){
self.delegate.doSomething() // might fail if delegate is nil
}
}


class ClassConformingToDelegate: NSObject, MyClassDelegate {

let myClass: MyClass

override init(){
myClass = MyClass()
super.init()
myClass.delegate = self // works because called after super.init
}

func doSomething(){
//called from the delegate
}
}

这些只是一些想法。我只是想学习最好的方法。我愿意接受所有建议。

谢谢!!

最佳答案

选项 2 看起来更好。但是,在这种情况下,建议使用可选类型作为委托(delegate)类型。这样,您就不需要每次使用它执行任务时都检查“if delegate != nil”。您可以简单地使用可选链接,它是专为您希望仅在可选包含值时才对其执行任务的情况而设计的。

protocol MyClassDelegate {
func doSomething()
}

class MyClass {

var delegate: MyClassDelegate?

init(){
}

func myClassFuction(){
self.delegate?.doSomething() // will do nothing if delegate is nil
}
}


class ClassConformingToDelegate: NSObject, MyClassDelegate {

let myClass: MyClass

override init(){
myClass = MyClass()
super.init()
myClass.delegate = self
}

func doSomething(){
//called from the delegate
}
}

关于xcode - 何时在 Swift 中初始化委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32574047/

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