为什么print()打印我的string作为可选?

我有一本字典,我想用它的一些值作为另一个字典的关键字:

let key: String = String(dictionary["anotherKey"]) 

在这里, dictionary["anotherKey"]42但是当我在debugging器中打印key时,我看到以下内容:

 (lldb) expression print(key) Optional(42) 

这怎么可能? 据我的理解, String()构造函数返回可选的(当我写let key: String而不是let key: String?时,编译器不会抱怨 )。 有人可以解释这里发生了什么?

作为旁注,我目前正在使用description()方法来解决这个问题。

这是devise – 这是如何实现斯威夫特Dictionary

Swift的Dictionarytypes实现了它的键值下标作为一个下标,并且返回一个可选的types。 […] Dictionarytypes使用可选的下标types来模拟事实,即不是每个键都有一个值,并给出一个方法来通过为该键分配一个零值来为键删除一个值。 ( 链接到文档 )

你可以在一个if let结构中解开结果来摆脱可选的,就像这样:

 if let val = dictionary["anotherKey"] { ... // Here, val is not optional } 

如果你确定这个价值在那里,例如,因为你把它放在词典之前几步,你就可以强制解开! 运营商:

 let key: String = String(dictionary["anotherKey"]!) 

你误解了结果。 String初始值设定项不返回可选项。 它返回可选的string表示forms。 它是一个值为"Optional(42)"的非可选string。

Swift字典总是返回一个Optional。

dictionary["anotherKey"]给出Optional(42) ,所以String(dictionary["anotherKey"])完全按照预期给出了"Optional(42)" (因为Optionaltypes符合StringLiteralConvertible,所以你得到了一个String )。

例如,你必须打开包装。

 if let key = dictionary["anotherKey"] { // use `key` here } 

这是编译器已经知道字典值的types。

如果没有,例如,如果types是AnyObject,你可以使用as? String as? String

 if let key = dictionary["anotherKey"] as? String { // use `key` here } 

或者作为一个Int如果AnyObject实际上是一个Int:

 if let key = dictionary["anotherKey"] as? Int { // use `key` here } 

或使用Int()将string数字转换为整数:

 if let stringKey = dictionary["anotherKey"], intKey = Int(stringKey) { // use `intKey` here }