Using Swift Codable With Property Lists
Trong 2 bài viết trước, tôi đã giới thiệu đến các bạn protocol mới của Apple là Codeable giúp chúng ta Parsing Data JSON trên swift 4 một cách đơn giản. Trong bài viết này tôi sẽ tiếp tục giới thiệu đến các bạn những lợi ích hay ho mà Codeable trong việc xử lý dữ liệu từ file Property Lists . ...
Trong 2 bài viết trước, tôi đã giới thiệu đến các bạn protocol mới của Apple là Codeable giúp chúng ta Parsing Data JSON trên swift 4 một cách đơn giản. Trong bài viết này tôi sẽ tiếp tục giới thiệu đến các bạn những lợi ích hay ho mà Codeable trong việc xử lý dữ liệu từ file Property Lists.
Chúng ta cùng nhớ lại cách sử dụng plist file trong Objective C:
NSURL *settingsURL = ... // location of plist file NSDictionary *settings = [NSDictionary dictionaryWithContentsOfURL:settingsURL];
Để ghi NSDictionary lại plist file:
[settings writeToURL:settingsURL atomically:YES];
Đọc và ghi Plist file với NSArray hay NSDictionary
let settingsURL: URL = ... // location of plist file let settings = NSDictionary(contentsOf: settingsURL) as? Dictionary<String, AnyObject>
Để ghi được vào plist file chúng ta phải down cast về kiểu NSDictionary:
(settings as NSDictionary).write(to: settingsURL, atomically: true)
Reading A Property List
Ví dụ, chúng ta có file plist nó là 1 kiểu dictionary bao gồm các kiểu boolean, interger và string: Định nghĩa một kiểu struct phù hợp với định dạng với format của file plist trên và sử dụng Codeable protocol:
struct MySettings: Codable { var someFlag: Bool var someString: String var someInt: Int }
- Chú ý rằng các key của struct phải phù hợp với các key trong các item của file plist.
- Nếu chỉ muốn đọc từ file plist thì ta chỉ cần sử dụng Decodable protocol.
- Một property list có thể chứa dictionaries, arrays, strings, numbers, dates, binary data and boolean values.
Để đọc/decode property list file ta tạo một đối tượng PropertyListDecoder và sau đó sử dụng decode method:
let settingsURL: URL = ... // location of plist file var settings: MySettings? if let data = try? Data(contentsOf: settingsURL) { let decoder = PropertyListDecoder() settings = try? decoder.decode(MySettings.self, from: data) }
Nếu bạn muốn handle errors thì sử dụng do...catch block:
do { let data = try Data(contentsOf: settingsURL) let decoder = PropertyListDecoder() settings = try decoder.decode(MySettings.self, from: data) } catch { // Handle error print(error) }
Để thay đổi tên các thuộc tính, ta phải thêm một kiểu CodeingKeys enum. Ví dụ:
struct MySettings: Codable { var someFlag: Bool var someString: String var id: Int private enum CodingKeys: String, CodingKey { case someFlag case someString case id = "someInt" } }
Writing A Property List
Writing hoặc encoding vào một property list rất đơn giản. Tạo một đối tượng PropertyListEncoder, set output format và sử dụng encode method:
let someSettings = MySettings(someFlag: true, someString: "Apple", someInt: 42) let encoder = PropertyListEncoder() encoder.outputFormat = .xml do { let data = try encoder.encode(someSettings) try data.write(to: settingsURL) } catch { // Handle error print(error) }
Chú ý rằng: outputFormat có thể là .binary, .openStep or .xml.
Ở trên, tôi đã giới thiệu cách dùng giao thức Codeable để thao tác với file Property Lists. Chúng ta có thể thấy trên swift 4, Apple đã cung cấp cho chúng ta protocol Codeable giúp chúng ta có thể thao tác dễ dàng với Plist File, mà không phải nhàm chán sử dụng NSArray hay NSDictionary để đọc ghi vào file Plist. Thank you!
https://developer.apple.com/documentation/swift/codable https://useyourloaf.com/blog/using-swift-codable-with-property-lists/?utm_campaign=iOS%2BDev%2BWeekly&utm_medium=email&utm_source=iOS_Dev_Weekly_Issue_315