Ios 双重感叹!!斯威夫特的马克?
我知道一个感叹号的定义,但是两个 我今天正在编写代码,编译器“强迫”我再添加一个!对我来说:Ios 双重感叹!!斯威夫特的马克?,ios,swift,optional-values,Ios,Swift,Optional Values,我知道一个感叹号的定义,但是两个 我今天正在编写代码,编译器“强迫”我再添加一个!对我来说: mySignal.subscribeNext({ (value: AnyObject!) -> () in let list: RACSequence = value["myObject"]!!.rac_sequence ... 如果我只用一个!mark,项目没有编译,给了我一个错误:“可选类型'AnyObject'的值没有展开;你是想使用'!'还
mySignal.subscribeNext({
(value: AnyObject!) -> () in
let list: RACSequence = value["myObject"]!!.rac_sequence
...
如果我只用一个!mark,项目没有编译,给了我一个错误:“可选类型'AnyObject'的值没有展开;你是想使用'!'还是'?'?'?”然后我再添加一个!一切正常
Swift中两个感叹号的含义是什么?您正在存储一个
任意对象
在字典中,因此您要存储一个可选值作为值。字典下标总是返回您存储的值的可选值,因此您得到的是可选值,这就是为什么您需要两个!,将其展开两次。这是使用AnyObject类型而不是显式字典类型的奇怪产物。通常,(感谢用户2864740)使用签名实现绑定操作,如Optional.bind(f:T->Optional)->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会出现这种情况,但我不相信这是预期的行为。我已经在操场上粘贴了这段代码,但在使用Swift 2.0时,我无法将[String:Int]类型的值转换为指定的AnyObject类型。这很奇怪。这个例子是基于Swift 1.2编写的,但是我在Xcode 7 beta 6中得到了与Swift 2相同的结果。很抱歉,我忘了添加
import UIKit
,我想您应该在代码片段的开头包含这一行,如果您将println
更改为print
,那就太好了。代码没有“存储任意对象!“在字典中”--代码下标为AnyObject!类型的值。首先不清楚为什么可以下标为AnyObject!,但在任何API中,双选项可能都不是预期的结果(请参阅下面的文章)。我今天在这里也经历了同样的情况:appDelegate.window!!.rootViewController=rootNavigationController,因此它似乎与词典无关。