我已经声明了这个协议(protocol)
protocol ReactorDelegate {
func ReactorUpdateUI()
}
在我的模型中,我有一个委托(delegate)可选属性并检查是否为空,将其解包以调用 VC 提供的协议(protocol)方法。
var delegate:ReactorDelegate?
if delegate {delegate?.ReactorUpdateUI()}
我的 VC 遵循协议(protocol)并具有 ReactorUpdateUI 方法
class VC_Reactor: UIViewController, ReactorDelegate
我试图在 VC 中创建模型的实例,但是失败了
let reactorCore=Reactor()
错误:“Reactor”不能用“()”构造这让我知道并非所有属性都有初始值。
我可以通过让我在 VC 中的委托(delegate)成为一个隐式展开的可选来解决这个问题
var reactorCore:Reactor!
并在带有自定义初始化的 ViewDidLoad 中:reactorCore=Reactor(delegate:self)
如果我将委托(delegate)属性声明为可选,我不明白为什么我需要自定义 init(delegate:ReactorDelegate)
。
最佳答案
您需要在委托(delegate)协议(protocol)中将该方法标记为可选:
@objc protocol ReactorDelegate {
optional func ReactorUpdateUI()
}
然后将您的类标记为 @objc
并在该方法上也使用可选链接:
delegate?.ReactorUpdateUI?()
注意:在编写协议(protocol)时,最简单的方法是保留所有必需的内容并在类中 stub 方法,然后当一切正常时返回并使您想要的可选内容成为可选内容。您收到的错误消息非常不透明,因此您一次可以处理更少的问题。
关于ios - Swift 委托(delegate)和可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24935979/