Swift代理和可选项

3

我已经声明了这个协议

protocol ReactorDelegate {
  func ReactorUpdateUI()
}

在我的模型中,我有一个可选的代理属性,检查它是否为非空,如果是,则解包它以调用VC提供的协议方法。

var delegate:ReactorDelegate? 

if delegate {delegate?.ReactorUpdateUI()}

我的 VC 遵循协议并具有 ReactorUpdateUI 方法。
class VC_Reactor: UIViewController, ReactorDelegate

我正在尝试在VC中创建一个模型实例,但是这个过程失败了。

let reactorCore=Reactor()
错误:'Reactor'无法使用'()'构造,这让我知道并非所有的属性都有初始值。
我可以通过在VC中使我的代理成为一个隐式解包可选类型来解决它 var reactorCore:Reactor!, 并在ViewDidLoad中使用自定义初始化:reactorCore = Reactor(delegate:self) 我不明白为什么需要一个自定义的init(delegate: ReactorDelegate),如果我将代理属性声明为可选类型。

也许你需要实现initWithNibName:bundle:方法。 - mxb
“Reactor” 到底是什么?是一个类、结构体还是协议?你甚至忘了完全定义它。如果你没有与我们分享所有信息,谁能给你任何答案呢? - holex
这是我第一次发布问题,我试图完整地描述,但失败了。Reactor是我的模型中的一个类。 - RMeeuws
Reactor 的父类是什么? - NikLoy
2个回答

18

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

@objc protocol ReactorDelegate {
    optional func ReactorUpdateUI()
}

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

delegate?.ReactorUpdateUI?()

注意:编写协议时,最好保持所有必需的内容并在类中存根方法,然后当一切都正常工作时返回并使您想要的内容变为可选。您收到的错误消息非常模糊,因此这样做可以让您一次处理较少的问题。


0

你必须像这样声明你的协议:

protocol ReactorDelegate: class {
   func ReactorUpdateUI()
}

然后,你的代理:

weak var delegate: ReactorDelegate
delegate?.ReactorUpdateUI()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接