使用EVReflection解析Dictionary类型的正确方法是什么?

时间:2018-09-04 20:24:13

标签: ios swift

我在我的应用中使用EVReflection。一个JSON响应应解析为Dictionary<String,Array<MyObject>>类型。我已经通过像这样重写setValue方法来成功解析了此代码:

override func setValue(_ value: Any!, forUndefinedKey key: String) {
    switch key {
    case "response":
        if let dict = value as? NSDictionary {
            response = Dictionary<String,Array<MyObject>>();
            for (key, value) in dict {
                var listValues = Array<MyObject>();
                if let array = value as? NSArray {
                    for vd in array {
                        listValues.append(MyObject(dictionary: vd as! NSDictionary));
                    }
                }
                response![key as? String ?? ""] = listValues;
            }
        }
        break;
    }
}

但是,我在控制台中看到以下错误:

  

错误:无法为Swift.Dictionary >

类型创建实例

我应该以其他方式执行此操作吗?如何使错误消失?

2 个答案:

答案 0 :(得分:0)

我可以通过使用propertyConverter来解决这个问题,

override public func propertyConverters() -> [(key: String, decodeConverter: ((Any?) -> ()), encodeConverter: (() -> Any?))] {
    return[
        (
            key: "response"
            , decodeConverter: {
                if let dict = $0 as? NSDictionary {
                    self.response = Dictionary<String,Array<MyObject>>();
                    for (key, value) in dict {
                        var listValues = Array<MyObject>();
                        if let array = value as? NSArray {
                            for vd in array {
                                listValues.append(MyObject(dictionary: vd as! NSDictionary));
                            }
                        }
                        self.response![key as? String ?? ""] = listValues;
                    }
                }
              }
            , encodeConverter: { return nil }
        )
    ]
}

答案 1 :(得分:0)

对于EVReflection,您应该使用NSDictionary而不是Dictionary(这是一个结构)。

如果执行此操作,则无需覆盖任何属性转换器方法。