如何在Swift中定义初始化泛型类型

时间:2017-01-07 05:40:56

标签: ios swift xcode

我正在写这样的功能

func issueArrayFromResponse(response: DataResponse<Any>) -> Result<[Issue]> {}

然而这种功能出现很多次,例如repoArrayFromResponse,gistArrayFromRespnse等等。所以我试着将这些功能集于一身。

func arrayFromResponse<T>(response: DataResponse<Any>) -> Result<[T]> {}

问题是我没有T型初始化程序,也不知道如何实现它。在issueArrayFromResponse的情况下,我有一个类Issue并且它有初始化器:init(json:[[String:Any]]),所以我能够写

issue = Issue(json: item)

但是,如果arrayFromResponse<T>,编译器会说'T' cannot be constructed because it has no accessible initializers

如何为T创建初始值设定项?

1 个答案:

答案 0 :(得分:2)

我认为最简单的方法是制定协议。 你可以制定这样的协议:

protocol ResultProtocol {   
}

并确认您的所有课程

class Issue: ResultProtocol {
    init(json: String) {

    }
}

然后你可以:

func arrayFromResponse<T: ResultProtocol>(response: DataResponse<Any>) -> Result<[T]> {

    return Result<[T]>()

}