Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 双重感叹!!斯威夫特的马克?_Ios_Swift_Optional Values - Fatal编程技术网

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,因此它似乎与词典无关。