我是一个名为User ..的结构模型,带有以下代码
struct User {
let userId: Double
}
extension User {
init(json: JSON) {
self.userId = json["userId"].double!
}
}
并且具有如下通用的普通类
class LoginTask<User>: Operation {
var userName: String
var password: String
init(username: String, password: String) {
self.userName = username
self.password = password
}
var request: Request {
return UserRequests.login(username: self.userName, password: self.password)
}
func exeute(in dispatcher: Dispatcher, completed: (User) -> Void) {
do {
do {
try dispatcher.execute(request: self.request, completion: { (response, error) in
if error == nil {
let user = User(json: response)
}
})
} catch {
}
}
}
}
操作是协议具有名为Output
的关联类型现在在线
let user = User(json: response)
它给出了错误
非标称类型“用户”不支持显式初始化
我试图制作User.Type ..但可能是我不完全理解这个概念或错误。
答案 0 :(得分:4)
您班级中的User
与您创建的User
类型不同。它只是任何类型的占位符。您可以将类定义中的单词User
替换为例如T
或Apple
,它仍然是相同的定义。
编译器对类中init
个方法User
的含义一无所知,因此错误。要使其正常工作,您必须约束类型参数。这通常通过使其符合协议来完成,例如
protocol JSONInitable
{
init(json: JSON)
}
struct User: JSONInitable { ... }
struct Group: JSONInitable { ... }
class LoginTask<PrincipalType: JSONInitable>
{
....
func foo()
{
let user = PrincipalType(json: response)
}
}
在上文中,LoginTask可以与User
和Group
一起使用,但不能与任何不符合协议的任意类型一起使用。
或者,如果该类始终使用User
类型,则不需要是通用的。