Swift中使用可选类型完美解决占位问题

2020-01-08 22:55:30刘景俊

}

 

Swift中更简便的方法

小伙伴们可能会问,为什么Swift中不需要实现这么一个API呢?其实其有更简单的实现,如下面代码所示:

复制代码
extension Dictionary {
    func valuesForKeys(keys: [Key]) -> [Value?] {
        return keys.map { self[$0] }
    }
}
上述方式实现的功能和最开始的方法实现的功能相同,虽然核心的功能是封装了map的调用,这个例子也说明了为什么Swift没有提供轻量级的API接口,因为小伙伴们简单的调用map就可以实现。

 

接下来,我们实验几个例子:

复制代码
var dic: Dictionary = [ "1": 2, "3":3, "4":5 ]

 

var t = dic.valuesForKeys(["1", "4"]) 
//结果为:[Optional(2), Optional(5)]

var t = dict.valuesForKeys(["3", "9"])
// 结果为:[Optional(3), nil]

t = dic.valuesForKeys([])
//结果为:[]

 

内嵌可选类型

现在,如果我们为每一个结果调用last方法,看下结果如何?

复制代码
var dic: Dictionary = [ "1": 2, "3":3, "4":5 ]

 

var t = dic.valuesForKeys(["1", "4"]).last //结果为:Optional(Optional(5))
// Optional(Optional("Ching"))

var t = dict.valuesForKeys(["3", "9"]).last
// 结果为:Optional(nil)

var t = dict.valuesForKeys([]).last
// 结果为:nil

 

小伙伴们立马迷糊了,为什么会出现两层包含的可选类型呢?,特别对第二种情况的Optional(nil),这是什么节奏?

我们回过头看看last属性的定义:

复制代码
var last:T? { get }
很明显last属性的类型是数组元素类型的可选类型,这种情况下,因为元素类型是(String?),那么再结合返回的类型,于是其结果就是String??了,这就是所谓的嵌套可选类型。但嵌套可选类型本质是什么意思呢?