Swift4新特性介紹2(下標支援泛型,Codable序列化)
阿新 • • 發佈:2018-12-19
文章目錄
下標支援泛型
下標的返回型別支援泛型
有時候我們會寫一些資料容器,Swift 支援通過下標來讀寫容器中的資料。但是如果容器類中的資料型別定義為泛型,過去下標語法就只能返回 Any,在取出值後需要用 as? 來轉換型別。現在 Swift4 定義下標也可以使用泛型了。
struct GenericDictionary<Key: Hashable, Value> {
private var data: [Key: Value]
init(data: [Key: Value]) {
self.data = data
}
subscript<T>(key: Key) -> T? {
return data[key] as? T
}
}
//字典型別: [String: Any]
let earthData = GenericDictionary (data: ["name": "Earth", "population": 7500000000, "moons": 1])
//自動轉換型別,不需要在寫 "as? String"
let name: String? = earthData["name"]
print(name)
//自動轉換型別,不需要在寫 "as? Int"
let population: Int? = earthData["population"]
print(population)
下標型別同樣支援泛型
extension GenericDictionary {
subscript<Keys: Sequence >(keys: Keys) -> [Value] where Keys.Iterator.Element == Key {
var values: [Value] = []
for key in keys {
if let value = data[key] {
values.append(value)
}
}
return values
}
}
// Array下標
let nameAndMoons = earthData[["moons", "name"]] // [1, "Earth"]
// Set下標
let nameAndMoons2 = earthData[Set(["moons", "name"])] // [1, "Earth"]
Codable 序列化
如果要將一個物件持久化,需要把這個物件序列化。過去的做法是實現 NSCoding 協議,但實現 NSCoding 協議的程式碼寫起來很繁瑣,尤其是當屬性非常多的時候。
Swift4 中引入了 Codable 協議,可以大大減輕了我們的工作量。我們只需要讓需要序列化的物件符合 Codable 協議即可,不用再寫任何其他的程式碼。
struct Language: Codable {
var name: String
var version: Int
}
Encode 操作
我們可以直接把符合了 Codable 協議的物件 encode 成 JSON 或者 PropertyList。
let swift = Language(name: "Swift", version: 4)
//encoded物件
let encodedData = try JSONEncoder().encode(swift)
//從encoded物件獲取String
let jsonString = String(data: encodedData, encoding: .utf8)
print(jsonString)
Decode 操作
let decodedData = try JSONDecoder().decode(Language.self, from: encodedData)
print(decodedData.name, decodedData.version)