我已宣布此协议
protocol ReactorDelegate {
func ReactorUpdateUI()
}
在我的模型中,我有一个委托可选属性,并检查是否不是,解包它以调用VC提供的协议方法。
var delegate:ReactorDelegate?
if delegate {delegate?.ReactorUpdateUI()}
我的VC遵循协议并具有ReactorUpdateUI方法
class VC_Reactor: UIViewController, ReactorDelegate
我试图在VC中创建模型的实例,但这失败了
let reactorCore=Reactor()
错误:'反应堆'不能用'()' 让我知道并非所有属性都具有初始值。
我可以通过在VC中使我的委托隐式地解包可选来解决它
var reactorCore:Reactor!
并在ViewDidLoad中使用自定义init:reactorCore=Reactor(delegate:self)
如果我声明委托属性是可选的,我不明白为什么我需要自定义init(delegate:ReactorDelegate)
。
答案 0 :(得分:18)
您需要在委托协议中将该方法标记为可选:
@objc protocol ReactorDelegate {
optional func ReactorUpdateUI()
}
然后将您的班级标记为@objc
并对该方法使用可选链接:
delegate?.ReactorUpdateUI?()
注意:在编写协议时,最简单的方法是保留所需的所有内容并将类中的方法存根,然后当一切正常时,返回并制作您想要的内容可选择是可选的。您收到的错误消息非常不透明,因此您一次只能处理较少的问题。
答案 1 :(得分:0)
您必须声明您的协议:
protocol ReactorDelegate: class {
func ReactorUpdateUI()
}
之后,你的代表:
weak var delegate: ReactorDelegate
delegate?.ReactorUpdateUI()