【问题标题】:Non-nominal type 'User' does not support explicit initialization非标称类型“用户”不支持显式初始化
【发布时间】:2018-02-01 10:46:54
【问题描述】:

我是一个名为 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 {

            }
        }
    }

}

操作是一个协议,其关联类型名为输出

现已上线

let user = User(json: response)

报错

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

我尝试制作 User.Type .. 但可能是我不完全理解这个概念或错误。

【问题讨论】:

标签: ios swift generics swift4


【解决方案1】:

您班级中的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 类型,则它不需要是泛型的。

【讨论】:

  • 我认为完美的解决方案 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多