【问题标题】:Dynamic initializer with protocol带有协议的动态初始化器
【发布时间】:2017-04-06 07:56:13
【问题描述】:

我正在与AlamofireSwiftyJSON 合作。我想为常见情况建立通用请求和解析模型。首先,我制定了一个名为JSONConvertible 的协议。

protocol JSONConvertible {
    init?(json: JSON)
}

其次,我在Alamofire 中扩展Request 类。

extension Request {

    func getResult(format: [String: AnyClass]) {
        self.responseJSON { (response) in
            guard let statusCode = response.response?.statusCode else {
                return
            }
            switch statusCode {
            case 200:
                var result = [String: AnyObject]()
                let json = JSON(rawValue: response.result.value!)!
                for (key, className) in format {
                    if className.self is JSONConvertible {
                        let value = className.self(json: json[key]) // get error in this line
                    }
                }
            case 201..<400:
                break
            case 400...Int.max:
                break
            default:
                break
            }

        }
    }   
}

但是我从编译器中得到一个错误。因为 AnyObject 只是协议,它没有这个初始化程序。我不想只得到字典或数组。我想获得具体类的实例。请帮我。非常感谢!

【问题讨论】:

    标签: ios swift alamofire swifty-json


    【解决方案1】:

    这是因为在 if 内部,className.self 的类型仍然是 AnyObject。您需要将其转换为JSONConvertible,然后才能使用初始化程序。

    if let concreteClass = className.self as? JSONConvertible.Type 
    {
       let value = concreteClass.init(json: json[key])
    }
    

    如果您熟悉 kotlin,那么在测试 if 子句中的类型时,swift 不会自动进行转换。

    【讨论】:

    • 至少没有错误了。谢谢!我会测试它是否有效。
    • 请注意,您不需要 .selfclassName as? JSONConvertible.Type 即可。
    【解决方案2】:

    我找到了另一种方法来解决这个问题。定义一个新协议。

    protocol JSONConvertibleObject: AnyObject, JSONConvertible {
    
    }
    

    改用这个。

    extension Request {
    
        func getResult(format: [String: JSONConvertibleObject]) {
            self.responseJSON { (response) in
                guard let statusCode = response.response?.statusCode else {
                    return
                }
                switch statusCode {
                case 200:
                    var result = [String: AnyObject]()
                    let json = JSON(rawValue: response.result.value!)!
                    for (key, className) in format {
                        let value = className.self.dynamicType.init(json: json[key])
                    }
                case 201..<400:
                    break
                case 400...Int.max:
                    break
                default:
                    break
                }
    
            }
        }   
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-17
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多