动态初始化与协议

我正在与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只是协议,并没有这个初始化器。 我不想只得到一个字典或数组。 我想获得具体类的实例。 请帮帮我。 非常感谢!

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

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

如果你熟悉kotlin,swift在if语句中测试类型时不会自动执行。

我找到了另一种解决方法。 定义一个新的协议。

 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 } } } }