1. 程式人生 > >Swift4新特性介紹2(下標支援泛型,Codable序列化)

Swift4新特性介紹2(下標支援泛型,Codable序列化)

原文 http://www.hangge.com/blog/cache/detail_1824.html

文章目錄

下標支援泛型

下標的返回型別支援泛型

有時候我們會寫一些資料容器,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)