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

可选类型是Swift中新引入的,功能很强大。在这篇博文里讨论的,是在Swift里,如何通过可选类型来保证强类型的安全性。作为例子,我们来创建一个Objective-C API的Swift版本,但实际上Swift本身并不需要这样的API。

为Dictionary增加objectsForKeys函数

在Objective-C中,NSDictionary有一个方法-objectsForKeys:NoFoundMarker:, 这个方法需要一个NSArray数组作为键值参数,然后返回一个包含相关值的数组。文档里写到:"返回数组中的第N个值,和输入数组中的第N个值相对应",那如果有某个键值在字典里不存在呢?于是就有了notFoundMarker作为返回提示。比如第三个键值没有找到,那么在返回数组中第三个值就是这个notFoundMarker,而不是字典中的第三个值,但是这个值只是用来提醒原字典中没有找到对应值,但在返回数组中该元素存在,且用notFoundMarker作为占位符,因为这个对象不能直接使用,所以在Foundation框架中有个专门的类处理这个情况:NSNull。

在Swift中,Dictionary类没有类似objectsForKeys的函数,为了说明问题,我们动手加一个,并且使其成为操作字典值的通用方法。我们可以用extension来实现:

extension Dictionary{

    func valuesForKeys(keys:[K], notFoundMarker: V )->[V]{

        //具体实现代码后面会写到

    }

}


以上就是我们实现的Swift版本,这个和Objective-C版本有很大区别。在Swift中,因为其强类型的原因限制了返回的结果数组只能包含单一类型的元素,所以我们不能放NSNull在字符串数组中,但是,Swift有更好的选择,我们可以返回一个可选类型数据。我们所有的值都封包在可选类型中,而不是NSNull, 我们只用nil就可以了。

extension Dictionary{

    func valuesForKeys(keys: [Key]) -> [Value?] {

        var result = [Value?]()

        result.reserveCapacity(keys.count)

        for key in keys{

            result.append(self[key])

        }

        return result

    }

}

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([])

//结果为:[]

以上是 Swift中使用可选类型完美解决占位问题 的全部内容, 来源链接: utcz.com/z/315228.html

回到顶部