ios - Swift 委托(delegate)和可选

标签 ios delegates swift option-type

我已经声明了这个协议(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/

相关文章:

ios - 获取与 Phibrow App 相同的标签动画

ios - Swift 4 委托(delegate)不适用于标签栏 Controller

ios - UITextView如何实现搜索功能?

android - Codename One - 跨平台 BrowserComponent 页面加载指示器

ios - 将字符串数组打印到 UILabel

ios - SVN 和 Xcode 文件路径和更新问题

c# - 检查处理程序是否!= null 与检查事件是否!= C# 中的 null

iphone - 是否为 Core Data 的获取结果 Controller 实现委托(delegate)

c# - 从委托(delegate)中读取返回值

ios - setNavigationBarHidden 不适用于其他类(Swift 3.0)