非标称类型“用户”不支持显式初始化

时间:2018-02-01 10:46:55

标签: ios swift generics swift4

我是一个名为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 ..但可能是我不完全理解这个概念或错误。

1 个答案:

答案 0 :(得分:4)

您班级中的User与您创建的User类型不同。它只是任何类型的占位符。您可以将类定义中的单词User替换为例如TApple,它仍然是相同的定义。

编译器对类中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可以与UserGroup一起使用,但不能与任何不符合协议的任意类型一起使用。

或者,如果该类始终使用User类型,则不需要是通用的。