【Swift】Dictionary的下标语法与Optional的本质

今天看到一个有趣的例子:

var dictionary: [String: String?] = ["key": nil]
dictionary["key"] = nil

乍一看,感觉两行代码赋予dictionary的值应该是相同的,但其实第一行得到["key": nil],而第二行[:]

这就涉及到了Dictionary下标(subscript)的使用与Optional的本质问题。Swift Standard Library中关于Dictionary下标语法的注释提到了:

If you assign nil as the value for the given key, the dictionary removes that key and its associated value.

那么问题来了,难道就不能使用下标语法赋予一个key nil值吗?

Optional的本质

我们很容易陷入一个误区,拿String类型为例,认为String?String进行了特殊设置的变种。但其实Optional是一个枚举类型。如果你在任何Swift文件中输入Optional,然后[⌘ + Click] 点击,你就会看到Optional的定义:

public enum Optional<Wrapped> : ExpressibleByNilLiteral {
    case none
    case some(Wrapped)
    ...
}

所以如果想要用下标给字典中的key赋予nil值,使用

dictionary["key"] = Optional<String>.none
//或者
dictionary["key"] = nil as String?

就可以了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容