Using Swift Codable With Property Lists

1. Giới thiệu

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.

2. NSDictionary and NSArray

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)

3. Using Codable For Property Lists

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.

3. Tổng kết

Ở 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!

Nguồn:

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


All Rights Reserved