Swift 为什么可以’;在将协议约束到类时,我是否使用协议所需的初始值设定项?
Swift不允许我编译带有错误消息的以下代码 使用元类型值构造类类型为“T”的对象必须使用“必需”初始值设定项Swift 为什么可以’;在将协议约束到类时,我是否使用协议所需的初始值设定项?,swift,Swift,Swift不允许我编译带有错误消息的以下代码 使用元类型值构造类类型为“T”的对象必须使用“必需”初始值设定项 在指示的行上。协议明确要求使用初始值设定项。将构造移到初始值设定项中会导致相同的问题。如果我删除where Self:ChannelUser(以及使用其方法的代码),所有内容都会编译。这个问题也可以通过要求ChannelUser中的初始值设定项来解决,但这显然是离题的 为什么会这样?我是做错了什么还是这是一个错误 class ChannelUser { func ready()
在指示的行上。协议明确要求使用初始值设定项。将构造移到初始值设定项中会导致相同的问题。如果我删除
where Self:ChannelUser
(以及使用其方法的代码),所有内容都会编译。这个问题也可以通过要求ChannelUser中的初始值设定项来解决,但这显然是离题的
为什么会这样?我是做错了什么还是这是一个错误
class ChannelUser {
func ready() {
print("ready")
}
}
class A: ChannelUser { // Cannot be used with MockChannelUser because the initializer takes an Int
init(a: Int) {
// do something clever with a
}
}
class B: ChannelUser, MockableChannelUser { // Can be used with MockChannelUser
override required init() {}
}
protocol MockableChannelUser where Self: ChannelUser {
init()
}
struct MockChannelUser<T: MockableChannelUser> {
let user = T() // Error: Constructing an object of class type 'T' with a metatype value must use a 'required' initializer
init() {
user.ready()
}
}
类用户{
func ready(){
打印(“就绪”)
}
}
类A:ChannelUser{//不能与MockChannelUser一起使用,因为初始值设定项采用Int
init(a:Int){
//用手指做些聪明的事
}
}
B类:ChannelUser,MockableChannelUser{//可与MockChannelUser一起使用
重写所需的init(){}
}
协议MockableChannelUser,其中Self:ChannelUser{
init()
}
结构MockChannelUser{
let user=T()//错误:使用元类型值构造类类型为“T”的对象必须使用“必需”初始值设定项
init(){
user.ready()
}
}
“这个问题也可以通过要求ChannelUser中的初始值设定项来解决,但这显然是离题的。”这不是全部要点吗?它告诉我们将ChannelUser.init()
标记为required
,这应该是解决方案。(如果ChannelUser
已经有了一个init()
,那么init要求的意义是什么?你的协议还有更多吗?不清楚这个协议试图实现什么。)@RobNapier没有。不是所有ChannelUser子类都必须提供init()
。但是那些想要与MoChanChnEnter用户一起使用的文件必须提供它。有趣的是,看起来ChannelUser.init()
标记为required
,这应该是解决方案。(如果ChannelUser
已经有了一个init()
,那么init要求的意义是什么?你的协议还有更多吗?不清楚这个协议试图实现什么。)@RobNapier没有。不是所有ChannelUser子类都必须提供init()
。但是那些想要与MoChanChnEnter用户一起使用的文件必须提供它。有趣的是,看起来