斯威夫特代表&可选的

时间:2014-07-24 14:06:16

标签: ios delegates swift optional

我已宣布此协议

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)

2 个答案:

答案 0 :(得分:18)

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

@objc protocol ReactorDelegate {
    optional func ReactorUpdateUI()
}

然后将您的班级标记为@objc并对该方法使用可选链接:

delegate?.ReactorUpdateUI?()

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

答案 1 :(得分:0)

您必须声明您的协议:

protocol ReactorDelegate: class {
   func ReactorUpdateUI()
}

之后,你的代表:

weak var delegate: ReactorDelegate
delegate?.ReactorUpdateUI()