假设我有以下内容:

var didConnectObserver: NSObjectProtocol?

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

在某些时候,我取消注册:
NSNotificationCenter.defaultCenter().removeObserver(didConnectObserver)

但是,这不起作用,因为 didConnectObserver 是 optional 。有没有比以下更紧凑的写法:
if let obs = didConnectObserver {
    NSNotificationCenter.defaultCenter().removeObserver(obs)
}

如果 didConnectObservernil ,那仍然是正确的吗?

最佳答案

我仍然掌握 map 与 Optionals 的窍门,但我相信这会奏效:

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

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

以下是您输入 didConnectObserver.map 时自动完成显示的内容:

swift - 在 Swift 中调用具有 optional 类型的函数-LMLPHP

这是相同概念的另一个示例:
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 中调用具有 optional 类型的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33863244/

10-11 23:52