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

时间:2016-04-20 12:57:17

标签: ios swift

我有一本字典,我想将其一些值用作另一个字典的键:

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

此处dictionary["anotherKey"]42但是当我在调试器中打印key时,我会看到以下内容:

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

怎么可能?据我所知,String()构造函数返回一个可选项(编译器不会抱怨,而不是let key: String而不是{{1} }})。有人能解释一下这里发生了什么吗?

作为旁注,我目前正在使用let key: String?方法解决此问题。

4 个答案:

答案 0 :(得分:4)

这是设计的 - 它是Swift Dictionary的实施方式:

  

Swift的Dictionary类型将其键值下标实现为获取并返回可选类型的下标。 [...] Dictionary类型使用可选的下标类型来模拟不是每个键都有值的事实,并通过为该键指定nil值来为删除键的值提供一种方法。 (link to documentation

您可以在if let构造中展开结果以摆脱可选项,如下所示:

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

如果您确定该值存在,例如,因为您之前几步将其放入字典中,您可以强制使用!运算符进行展开:

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

Swift词典总是返回一个Optional。

dictionary["anotherKey"]提供Optional(42),因此String(dictionary["anotherKey"])完全按预期提供"Optional(42)"(因为Optional类型符合StringLiteralConvertible,因此您获得Optional的String表示形式)。

您需要打开,例如if let

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

这时编译器已经知道字典值的类型。

如果没有,例如,如果类型是AnyObject,则可以使用as? String

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

如果AnyObject实际上是Int:

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

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

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

答案 3 :(得分:0)

在字典中没有这样的键的情况下,您也可以通过使用默认值来避免强制展开

var dictionary = ["anotherkey" : 42]

let key: String = 
String(dictionary["anotherkey", default: 0])
print(key)