gpt4 book ai didi

ios - 非标称类型 'User' 不支持显式初始化

转载 作者:搜寻专家 更新时间:2023-11-01 06:14:11 24 4
gpt4 key购买 nike

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

}
}
}

}

操作是一个协议(protocol),它具有名为 Output 的关联类型

上线

let user = User(json: response)

它给出了错误

Non-nominal type 'User' does not support explicit initialization

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

最佳答案

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

编译器对您的类中的 User 有哪些init 方法一无所知,因此会出现错误。要使其正常工作,必须对类型参数进行约束。这通常是通过使其符合协议(protocol)来完成的,例如

protocol JSONInitable
{
init(json: JSON)
}

struct User: JSONInitable { ... }
struct Group: JSONInitable { ... }

class LoginTask<PrincipalType: JSONInitable>
{
....

func foo()
{
let user = PrincipalType(json: response)
}
}

在上面,LoginTask 可以与 UserGroup 一起使用,但不能与任何不符合协议(protocol)的任意类型一起使用。

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

关于ios - 非标称类型 'User' 不支持显式初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48560894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com