为什么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的
Dictionary
types实现了它的键值下标作为一个下标,并且返回一个可选的types。 […]Dictionary
types使用可选的下标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 }
- 无法调用非functiontypes模块的值<Firebase>
- Firebase查询 – 我得到一些types的NSArray作为结果(有时只)
- 如何使用NSTimer使UICollectionView自动滚动?
- Swift函数在应用程序中工作,但不在重写func viewDidLoad()
- Swift – 线程1:信号SIGABRT
- 如何使用Eureka创build自定义行内行?
- NSInvalidArgumentException原因:“Storyboard不包含带有标识符”CenterViewController“的视图控制器
- 如何执行Realm计数查询
- Swift – 从远端URL下载video并保存在相册中