在Swift中使用可选类型调用函数
假设我有以下几点:在Swift中使用可选类型调用函数,swift,optional,Swift,Optional,假设我有以下几点: var didConnectObserver: NSObjectProtocol? didConnectObserver = NSNotificationCenter.defaultCenter().addObserverForName( MyKey, object: nil, queue: nil, usingBlock: { (note) -> Void in ... }) 在某个时候,我注销了: NSNotificationCenter.def
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)
}
如果
didConnectObserver
为nil
?我仍然掌握了map
选项的窍门,但我相信这会起作用:
_ = didConnectObserver.map(NSNotificationCenter.defaultCenter().removeObserver)
如果didConnectObserver
为nil
,则其结果为nil
,否则它将使用didConnectObserver执行函数代码>。\uu=
是必要的,以抑制调用“map”的结果未使用的警告
以下是键入didConnectObserver.map
时自动完成显示的内容:
以下是相同概念的另一个示例:
func add5(i: Int) {
print("add 5 called")
print(i + 5)
}
let a: Int? = 10
_ = a.map(add5)
如果a
为nil
,则不调用add5
。如果a
是可选(10)
,则调用add5
,并打印15
它的工作原理就像:
if a != nil {
add5(a!)
}
我认为这是不可能的。前几天我在想这个。我认为这是一个合理的问题。我认为需要对序列类型(例如数组)调用map,而且我认为您需要使用。。didiConnectObserver?.map{…}您可以在单个可选项上调用map。请看一个有效的例子。如果Swift能够使可选的符合CollectionType
(就像Scala那样),或者至少符合SequenceType
,那么它将具有forEach
和过滤器,这将是一件好事。map
函数在这里工作,但是如果可用的话,forEach
会更有意义。太棒了。不知道你可以在上面调用map
。这将非常类似于函子。