Codable swift 4
Contents
Codable là gì?
Chắc hẳn ở swift 3 đa số chúng ta sử dụng lib ObjectMapper để parse json thành model. Thư viện này khá tiện dụng, tuy nhiên có một nhược điểm là chúng ta vẫn phải viết hàm map key. Điều này mình không thích lắm, trước đây objc có JSONModel parse thông minh hơn hẳn, ai dùng qua chắc đều biết. Đáng tiếc là ở swift không có thằng nào như vầy cả.
Tuy nhiên điều đó đã thay đổi khi swift 4 xuất hiện đi kèm với Codable. Vậy Codable là gì?
Theo như Apple quảng cáo, Codable giúp ta được 2 việc:
- Encodable dùng để encoding
- Decodable dùng để decoding
/// A type that can convert itself into and out of an external representation.
public typealias Codable = Decodable & Encodable
Về bản chất Codable là một protocol kết hợp giữa 2 protocol Encodable và Decodable, mỗi protocol lại đảm nhận chức năng như nói ở trên. Có thể coi Codable tương đương với một chiêu hai thức :D
Decodable như thế nào?
Giả sử ta có một json string như sau
|
|
Chúng ta sẽ định nghĩa struct kế thừa Codable
|
|
Giờ là lúc thức thứ nhất Decodable thể hiện sức mạnh
|
|
Ở đây mình cố tình cho biến date vào trong json string, nên parse hơi dài (có thêm bước format data), tuy nhiên về cơ bản chỉ cần 2 dòng code tương ứng 2 bước:
- Convert json thành data
- tạo đối tượng JSONDecoder để thực hiện decode
|
|
Vì công thức chỉ có 2 bước, tương ứng với mọi đối tượng, thế nên mình có thể tạo Generic cho việc decoding như sau:
|
|
Tương ứng với code sẽ rút ngắn đi như thế này
|
|
Đôi khi, mình muốn đặt tên thuộc tính theo ý mình, không theo key trên server trả về, có được không nhỉ? Decodable bất chấp hết nhưng cần thêm 1 bước:
Giả sử ở struct User đầu ta đổi property name thành…username, ta sẽ phải thêm 1 enum CodingKeys kế thừa CodingKey vào trong struct User
Có 2 điều bắt buộc đối với enum kế thừa CodingKey:
- Phải có type là String.
- Các case phải trùng với tên thuộc tính của đối tượng. Với những thuộc tính cần mapping thì ta gán giá trị, vd: username gán giá trị là “name”(trùng với json key).
Encoding như thế nào?
Thức thứ hai trong Codable là Encodable, về cơ bản nó ngược lại với Decodable, thế nên mình chỉ show code thôi.
|
|
Về tính ứng dụng: với Encodable ta dễ dàng lưu struct vào UserDefaults hoặc tạo params để post lên server chẳng hạn.
Source code của toàn bộ ví dụ: source
Author crossover
LastMod 2017-11-18