在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
}
}
于是,之前定义title
和duration
的代码就可以简化成:
let title: String? = json["title"]
let duration: Int? = json["duration"]
这样,就不用再频繁的使用类型转换了。
网友评论