swift - 在 Swift 中调用具有可选类型的函数

标签 swift option-type

假设我有以下内容:

var didConnectObserver: NSObjectProtocol?

didConnectObserver = NSNotificationCenter.defaultCenter().addObserverForName(
    MyKey, object: nil, queue: nil, usingBlock: { (note) -> Void in
    ...
})

在某些时候我注销了:

NSNotificationCenter.defaultCenter().removeObserver(didConnectObserver)

但这不起作用,因为 didConnectObserver 是可选的。有没有比以下更紧凑的写法:

if let obs = didConnectObserver {
    NSNotificationCenter.defaultCenter().removeObserver(obs)
}

如果 didConnectObservernil,那仍然会做正确的事情吗?

最佳答案

我仍然在使用 Optionals 来掌握 map 的窍门,但我相信这会奏效:

_ = didConnectObserver.map(NSNotificationCenter.defaultCenter().removeObserver)

如果didConnectObservernil,则结果为nil,否则执行函数didConnectObserver!_ = 是抑制警告 Result of call to 'map' is unused 所必需的。

这是当您键入 didConnectObserver.map 时自动完成显示的内容:

enter image description here

这是同一概念的另一个例子:

func add5(i: Int) {
    print("add 5 called")
    print(i + 5)
}

let a: Int? = 10

_ = a.map(add5)

如果anil,则不会调用add5。如果 aOptional(10),则调用 add5 并打印 15

它的工作原理如下:

if a != nil {
    add5(a!)
}

关于swift - 在 Swift 中调用具有可选类型的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33863244/

相关文章:

objective-c - 我需要从 Swift 调用 Objective C 方法

swift - 标签栏 Controller 干扰导航栏

ios - 使用 Swift 在 Parse 中同步保存

java - 为什么不应该在参数中使用 Java 8 的 Optional

c# - 也许是类和可选参数

ios - Swift 将多个文件并行上传到 AWS S3 并在 tableview 单元格中显示进度 View 状态

ios - 如何在滚动底部加载更多数据并在滚动时关闭弹跳?

java - 我应该如何使用Optional 和ifPresent(...) 重构代码以...不?

swift - 解包选项导致崩溃似乎违反直觉

java - 如何使用 Jackson 为具有可选字段的类反序列化 json