Swift 4使用泛型作为返回值

时间:2018-09-10 09:13:51

标签: swift generics decodable

我有一个类似的协议:

protocol ModelProtocol{

    func parse<T.Model>(data: Data) -> Array<T>? {}

}

返回是一组选项值。该方法接收数据,对其进行解析,然后从API数据返回解析对象的数组。

API返回的数据类型称为MyData,它具有一个数组作为字典的值。

我像这样解析JSON

func parse<T>(data: Data) -> Array<T>? {
    do {

        let newJSONDecoder = JSONDecoder()
        let menu = try newJSONDecoder.decode(MyData.self, from:data)
        let dataArray = menu.data //array
        let modelArray = Array<T>()
        for object in dataArray {


            modelArray.append(object)

        }

        return modelArray

    }
    catch {
        print("error while parsing:\(error.localizedDescription)")
        return nil
    }

}

在追加到要返回的数组的那一行上出现错误。

  

无法使用类型为((MyData.Drinks)''的参数列表调用'append'

最终,我希望返回的数组具有数组MyData.data中的类型的对象-在这种情况下,类型为Drinks。但更广泛地说,我希望该方法返回任何JSON负载中的任何类型。目的是创建一种方法,该方法可以接收任何数据并以数组中X类型的已解析对象的形式返回任何对象。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

首先,代码无法编译:

  

协议方法不得包含正文

所以您必须删除括号:

protocol ModelProtocol{
    func parse<T : Decodable>(data: Data) -> Array<T>?
}

要解决您的问题,请同样创建通用的MyData

struct MyData<T : Decodable> : Decodable {
    let data : [T]?
}

并声明parse

func parse<T : Decodable>(data: Data) -> Array<T>? {

    do {
        let newJSONDecoder = JSONDecoder()
        let menu = try newJSONDecoder.decode(MyData<T>.self, from:data)
        return menu.data
    }
    catch {
        print("error while parsing: ", error)
        return nil
    }
}

print总是整个error,以获取有关解码错误的详细信息。 localizedDescription太宽。


如果预计data是非可选的,请制作parse throw并移交解码错误

protocol ModelProtocol{
    func parse<T : Decodable>(data: Data) throws -> Array<T>
}

struct MyData<T : Decodable> : Decodable {
    let data : [T]
}

func parse<T : Decodable>(data: Data) throws -> Array<T> {
    let newJSONDecoder = JSONDecoder()
    let menu = try newJSONDecoder.decode(MyData<T>.self, from:data)
    return menu.data
}