双重感叹!!在 Swift 中标记?
Double exclamation !! mark in Swift?
我知道单个感叹号的定义,但是两个?
我今天在编码,编译器"force"我再补充一个!我的句子:
mySignal.subscribeNext({
(value: AnyObject!) -> () in
let list: RACSequence = value["myObject"]!!.rac_sequence
...
如果我只用一个!马克,项目没有编译,给我错误: "Value of optional type 'AnyObject?' not unwrapped; did you mean to use '!' or '?'?" 然后我再添加一个!一切正常。
两个感叹号在Swift中是什么意思?
您在字典中存储了一个 AnyObject!
,因此您存储了一个可选值作为值。字典下标总是 return 您存储的值的可选值,所以您得到一个可选的可选值,这就是为什么您需要两个 !, 来解包两次。
这是使用 AnyObject 类型而不是显式字典类型的奇怪产物。通常,a monad like Optional(感谢 user2864740)使用 Optional<T>.bind(f: T -> Optional<U>) -> Optional<U>
.
等签名实现绑定操作
这样一来,当您访问可选值的可选成员时,您不会得到双可选,您必须像洋葱一样在每一层访问中解包。
如果你用一个显式字典做一个类似的例子,你会发现结果类型只是一个 Optional 的单层:
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 会发生这种情况,但我认为这不是预期的行为。
我知道单个感叹号的定义,但是两个?
我今天在编码,编译器"force"我再补充一个!我的句子:
mySignal.subscribeNext({
(value: AnyObject!) -> () in
let list: RACSequence = value["myObject"]!!.rac_sequence
...
如果我只用一个!马克,项目没有编译,给我错误: "Value of optional type 'AnyObject?' not unwrapped; did you mean to use '!' or '?'?" 然后我再添加一个!一切正常。
两个感叹号在Swift中是什么意思?
您在字典中存储了一个 AnyObject!
,因此您存储了一个可选值作为值。字典下标总是 return 您存储的值的可选值,所以您得到一个可选的可选值,这就是为什么您需要两个 !, 来解包两次。
这是使用 AnyObject 类型而不是显式字典类型的奇怪产物。通常,a monad like Optional(感谢 user2864740)使用 Optional<T>.bind(f: T -> Optional<U>) -> Optional<U>
.
这样一来,当您访问可选值的可选成员时,您不会得到双可选,您必须像洋葱一样在每一层访问中解包。
如果你用一个显式字典做一个类似的例子,你会发现结果类型只是一个 Optional 的单层:
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 会发生这种情况,但我认为这不是预期的行为。