Swift 为什么可以’;在将协议约束到类时,我是否使用协议所需的初始值设定项?

Swift 为什么可以’;在将协议约束到类时,我是否使用协议所需的初始值设定项?,swift,Swift,Swift不允许我编译带有错误消息的以下代码 使用元类型值构造类类型为“T”的对象必须使用“必需”初始值设定项 在指示的行上。协议明确要求使用初始值设定项。将构造移到初始值设定项中会导致相同的问题。如果我删除where Self:ChannelUser(以及使用其方法的代码),所有内容都会编译。这个问题也可以通过要求ChannelUser中的初始值设定项来解决,但这显然是离题的 为什么会这样?我是做错了什么还是这是一个错误 class ChannelUser { func ready()

Swift不允许我编译带有错误消息的以下代码

使用元类型值构造类类型为“T”的对象必须使用“必需”初始值设定项


在指示的行上。协议明确要求使用初始值设定项。将构造移到初始值设定项中会导致相同的问题。如果我删除
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用户一起使用的文件必须提供它。有趣的是,看起来 T-()(代码)>正在解析为<代码> ChannelUser <代码> <代码>()/代码>,并且诊断没有集成到约束系统中,所以它不考虑<代码> MockableChannelUser < /C> >代码> In()/<代码>要求。这似乎在master上得到了解决,因此也访问了其他解决方案。“这个问题也可以通过要求ChannelUser中的初始值设定项来解决,但这显然偏离了重点。”这不是全部要点吗?它告诉我们将
ChannelUser.init()
标记为
required
,这应该是解决方案。(如果
ChannelUser
已经有了一个
init()
,那么init要求的意义是什么?你的协议还有更多吗?不清楚这个协议试图实现什么。)@RobNapier没有。不是所有ChannelUser子类都必须提供
init()
。但是那些想要与MoChanChnEnter用户一起使用的文件必须提供它。有趣的是,看起来 T-()(代码)>正在解析为<代码> ChannelUser <代码> <代码>()/代码>,并且诊断没有集成到约束系统中,所以它不考虑<代码> MockableChannelUser < /C> >代码> In()/<代码>要求。不过,这似乎在master上是固定的,因此也会访问其他解决方案。