双重感叹!!在斯威夫特?

时间:2015-07-17 02:22:42

标签: ios swift optional-values

我知道单个感叹号的定义,但有两个?

我今天正在编码和编译器" force"我再加一个!我的句子:

mySignal.subscribeNext({
        (value: AnyObject!) -> () in
        let list: RACSequence = value["myObject"]!!.rac_sequence
        ...

如果我只使用一个! mark,项目没有编译,给我错误:"可选类型的值' AnyObject?'没有打开;你的意思是使用'!'或'?'?"然后我再添加一个!一切正常。

Swift中两个感叹号的含义是什么?

2 个答案:

答案 0 :(得分:7)

您在词典中存储了AnyObject!,因此您可以将可选项存储为值。字典下标总是会返回您要存储的值的可选项,因此您需要获取可选的可选项,这就是为什么需要两个!来打开它的两次。

答案 1 :(得分:6)

这是使用AnyObject类型而不是显式字典类型的奇怪工件。通常,a monad like Optional(感谢user2864740)使用Optional<T>.bind(f: T -> Optional<U>) -> Optional<U>之类的签名实现绑定操作。

这样,当你访问一个可选值的可选成员时,你就不会得到一个双重选项,你必须像每个访问层的洋葱一样展开。

如果你使用显式字典做了类似的例子,你会发现结果类型只是一层可选:

import UIKit

let anyDict: AnyObject? = ["foo" : 34, "bar" : 13]
let anyElement = anyDict?["foo"]
print(anyElement) // Optional(Optional(34))

let dict: [String : Int]? = ["foo" : 34, "bar" : 13]
let element = dict?["foo"]
print(element) // Optional(34)

不清楚为什么AnyObject会发生这种情况,但我不相信它是预期的行为。