Swift委托和可选

RMe*_*uws 3 delegates optional ios swift

我已经宣布了这个协议

protocol ReactorDelegate {
  func ReactorUpdateUI()
}
Run Code Online (Sandbox Code Playgroud)

在我的模型中,我有一个委托可选属性并检查是否不是nill,解包它以调用VC提供的协议方法.

var delegate:ReactorDelegate? 

if delegate {delegate?.ReactorUpdateUI()}
Run Code Online (Sandbox Code Playgroud)

我的VC遵循协议并具有ReactorUpdateUI方法

class VC_Reactor: UIViewController, ReactorDelegate
Run Code Online (Sandbox Code Playgroud)

我正在尝试在VC中创建模型的实例,但这失败了

let reactorCore=Reactor()
Run Code Online (Sandbox Code Playgroud)

错误:'Reactor'不能用'()'构建, 让我知道并非所有属性都有初始值.

我可以通过在VC中使用隐式解包的可选项var reactorCore:Reactor! 和使用自定义init的ViewDidLoad中的委托来解决它 :reactorCore=Reactor(delegate:self)

init(delegate:ReactorDelegate)如果我声明delegate属性是可选的,我不明白为什么我需要自定义.

Nat*_*ook 18

您需要在委托协议中将该方法标记为可选:

@objc protocol ReactorDelegate {
    optional func ReactorUpdateUI()
}
Run Code Online (Sandbox Code Playgroud)

然后将您的类标记为,@objc并在方法上使用可选链接:

delegate?.ReactorUpdateUI?()
Run Code Online (Sandbox Code Playgroud)

注意:在编写协议时,最简单的方法是保留所需的所有内容并将类中的方法存根,然后当一切正常时,返回并使您想要的选项成为可选项.您获得的错误消息非常不透明,因此您一次处理的问题较少.