Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 带协议的动态初始化器_Ios_Swift_Alamofire_Swifty Json - Fatal编程技术网

Ios 带协议的动态初始化器

Ios 带协议的动态初始化器,ios,swift,alamofire,swifty-json,Ios,Swift,Alamofire,Swifty Json,我正在使用Alamofire和SwiftyJSON。我想为常见情况构建通用的请求和解析模型。首先,我创建了一个名为JSONConvertible的协议 protocol JSONConvertible { init?(json: JSON) } 其次,我扩展了Alamofire中的Request类 extension Request { func getResult(format: [String: AnyClass]) { self.responseJSON

我正在使用
Alamofire
SwiftyJSON
。我想为常见情况构建通用的请求和解析模型。首先,我创建了一个名为
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
            }

        }
    }   
}
扩展请求{
func getResult(格式:[字符串:AnyClass]){
self.responseJSON{(response)in
guard let statusCode=响应。响应?.statusCode其他{
返回
}
开关状态码{
案例200:
var result=[String:AnyObject]()
让json=json(rawValue:response.result.value!)!
for(键、类名)的格式{
如果className.self是JSONConvertible{
让value=className.self(json:json[key])//在此行中获取错误
}
}

案例201..这是因为在
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
            }

        }
    }   
}
扩展请求{
func getResult(格式:[字符串:JSONConvertibleObject]){
self.responseJSON{(response)in
guard let statusCode=响应。响应?.statusCode其他{
返回
}
开关状态码{
案例200:
var result=[String:AnyObject]()
让json=json(rawValue:response.result.value!)!
for(键、类名)的格式{
让value=className.self.dynamicType.init(json:json[key])
}

案例201..至少不再出现错误。谢谢!我将测试它是否有效。注意,您不需要使用
.self
类名as?JSONConvertible。键入即可。