+2

ResponseModel in Swift!.

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.

  1. Tạo object có key và trả về 1 object.
  2. Tạo object không có key và trả về 1 object.
  3. Tạo collection object có key và trả về 1 collection object.
  4. 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí