ResponseModel in Swift!.
Bài đăng này đã không được cập nhật trong 6 năm
Bài toán.
trong quá trình phát triển dự án, chắc chắn nhiều bạn mới(trong đó có mình) gặp khó khăn với việc tạo model, điển hình là việc lấy data từ server về -> model mình muốn. vì swift là ngôn ngữ POP vậy thì mình áp dụng mình sẽ tận dụng sức mạnh của POP. tạo 1 protocol ResponseModel với mục đích, model adopt protocol này có khả năng tạo ra 1 object hay 1 [ object] là chính nó, với 4 trường hợp.
- Tạo object có key và trả về 1 object.
- Tạo object không có key và trả về 1 object.
- Tạo collection object có key và trả về 1 collection object.
- Tạo collection object không có key và trả về 1 collection object.
protocol ResponseModel {
init?(_ json: JSON?)
}
extension ResponseModel {
static func responseObject(forKey: String? = nil, object: Any?) -> Self? {
guard let object = object else {
return nil
}
/// has key
if let _forkey = forKey {
let json = JSON(object)[_forkey]
return self.init(json)
}
/// not key
let json = JSON(object)
return self.init(json)
}
static func responseCollectionObject(forKey: String? = nil, object: Any?) -> [Self]? {
guard let object = object else {
return nil
}
/// has key
if let _forKey = forKey {
let jsons = JSON(object)[_forKey].arrayValue
return jsons.flatMap{self.init($0)}
}
/// not key
let jsons = JSON(object).arrayValue
return jsons.flatMap{self.init($0)}
}
}
tạo model Users và adopt protocol ResponseModel trên.
final class Users: ResponseModel {
// MARK: - init
init?(_ json: JSON?) {
guard let json = json else {
return nil
}
parseJSON(json)
}
init?(_ data: Any) {
parseJSON(JSON(data))
}
}
extension Users {
/// all init call to here -> pass data
fileprivate func parseJSON(_ json: JSON) {
}
}
từ data trả về -> tạo ra model tương ứng để sử dụng.
func loadDataFromApi() {
_ = NetworkManager.request(urlRequest: Authen.login(key: "key")) { [weak self] (responseObject) in
if let user = Users.responseObject(object: responseObject) {
logD(user)
}
if let user = Users.responseObject(forKey: JSONKey.accessToken, object: responseObject) {
logD(user)
}
if let users = Users.responseCollectionObject(object: responseObject) {
logD(users)
}
if let users = Users.responseCollectionObject(forKey: JSONKey.accessToken, object: responseObject) {
logD(users)
}
}
}
Kết
- Cách này mình thường sử dụng trong dự án cũ, đối với các dự án đã nâng cấp lên swift 4 thì các bạn nên sử dụng codeable (là tính năng mới được giới thiệu trong swift 4).
All rights reserved