使用泛型下标操作符

2020-03-22  本文已影响0人  醉看红尘这场梦

SE-0148中,为Collection类型添加了一个新能力,可以让下标操作符返回一个泛型类型。对此,受益最大的,就是类似JSON处理的代码。我们通过对一个Swift 3场景的改造过程来理解它的用法:

首先,自定义一个表示JSON的类:

struct JSON {
    private var data: [String: Any]

    init(data: [String: Any]) {
        self.data = data
    }

    subscript(key: String) -> Any? {
        return data[key]
    }
}

其次,定义一个JSON对象:

let json = JSON(data: [
    "title": "Generic subscript",
    "duration": 300
])

最后,如果我们要读取JSON中的内容,在Swift 3中,只能把结果先读出来,此时类型是Any?,然后再转换成期望的类型:

let title: String? = json["title"] as? String
let duration: Int? = json["duration"] as? Int

在这个例子里,每次访问json中的值都要类型转换是一件很麻烦的事。在Swift 4里,允许我们把subscript定义成一个泛型函数,像这样:

struct JSON {
    // ...

    subscript<T>(key: String) -> T? {
        return data[key] as? T
    }
}

于是,之前定义titleduration的代码就可以简化成:

let title: String? = json["title"]
let duration: Int? = json["duration"]

这样,就不用再频繁的使用类型转换了。

上一篇 下一篇

猜你喜欢

热点阅读