Typecasting符合协议的{GenericType

时间:2017-02-06 09:47:33

标签: json swift generics swift3 operators

我正在尝试使用运算符将​​JSON解析为符合协议可映射的对象。

首先,我有一个名为Map的类,它的功能是存储正在解析的当前键以及要解析的完整JSON和要存储的当前值

private class Map {
    var json: [String : Any]?
    var key: String!
    convenience init(json: [String : Any]?) {
        self.init()
        self.json = json
    }

    public var currentValue: Any? {
        get{
            guard let key = key, let json = json else {
                return nil
            }
            return json[key]
        }
    }

    public subscript(key: String) -> Map {
        // save key and value associated to it
        self.key = key
        return self
    }
}

然后我有一个运算符,它根据Map.Key获取rhs上的当前值并将其传递给lhs,如果lhs是一个具有遵循协议Mappable的对象的数组,这就存在问题,它应该递归使用运算符,直到结束解析。

问题是:比较lhs是Array总是返回false,所以我不能对它进行类型转换以进行必要的迭代来解析它。 (评论说明)。

任何想法如何解决问题?

infix operator <<< // JSON to object


private func <<< <T: Any>(lhs: inout T, rhs: Map) {

    if let rhsArray = rhs.currentValue as? Array<Dictionary<String, Any>>{
        print(type(of: lhs)) // <Array<(Book in *someHash*)>>
        debugPrint(lhs is Array<Mappable>) // false

        var rhsReturnArray: Array<Mappable> = []
        for currentRHSValue in rhsArray {
//            let object = T.Element.self.from(Map(json: currentRHSValue))
//            rhsReturnArray.append(object)
        }
        // Do something
    }
    else if let value = rhs.currentValue as? T{
        lhs = value
    }
}




private class Autor: Mappable {
    var books: [Book]?

    func from(map: Map) -> Bool {
        books <<< map["Books"]
        return true
    }
}

private class Book: Mappable {


    var title: String?
    var numberOfPages: Int?
    func from(map: Map) -> Bool {
        title <<< map["Title"]
        numberOfPages <<< map["Number of Pages"]
        return true
    }
}


let someDictionary = ["Books" : [["Title": "Happy Potter", "Number of Pages": 420], ["Title": "Happy Potter2", "Number of Pages": 422]]]

private let autor = Autor()
autor.from(map: Map(json: someDictionary))

print(autor.books?.first)

我不能在这个项目中使用第三方框架。

0 个答案:

没有答案