我有一本字典,我想将其一些值用作另一个字典的键:
let key: String = String(dictionary["anotherKey"])
此处dictionary["anotherKey"]
为42
但是当我在调试器中打印key
时,我会看到以下内容:
(lldb) expression print(key)
Optional(42)
怎么可能?据我所知,String()
构造函数不返回一个可选项(编译器不会抱怨,而不是let key: String
而不是{{1} }})。有人能解释一下这里发生了什么吗?
作为旁注,我目前正在使用let key: String?
方法解决此问题。
答案 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:
,则作为Intif 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)