必须指定Swift协议中的初始值设定人。为什么会这样?

必须指定Swift协议中的初始值设定人。为什么会这样?,swift,compiler-errors,initialization,protocols,Swift,Compiler Errors,Initialization,Protocols,如果您试图在Swift中创建包含方便初始化器的协议,编译器会立即责骂您: protocol Zizo{ convenience init(a:String, b:Int) } 非类类型中不允许使用方便初始值设定项 这种限制有什么原因吗?这对我来说毫无意义 有什么可能出错?这是因为,这毫无意义协议仅定义实现者具有所需的方法和属性。它没有定义实现细节。当协议需要init(a:String,b:Int)时,可以根据需要将其实现为指定的或方便的初始值设定项 protocol Zizo{

如果您试图在Swift中创建包含方便初始化器的
协议
,编译器会立即责骂您:

protocol Zizo{
    convenience init(a:String, b:Int)
}
非类类型中不允许使用方便初始值设定项

这种限制有什么原因吗?这对我来说毫无意义


有什么可能出错?

这是因为,这毫无意义<代码>协议仅定义实现者具有所需的方法和属性。它没有定义实现细节。当
协议
需要
init(a:String,b:Int)
时,可以根据需要将其实现为指定的或方便的初始值设定项

protocol Zizo{
    init(a:String, b:Int)
}

class Foo:Zizo {
    init() {
    }
    convenience required init(a:String, b:Int) {
        self.init()
    }
}
class Bar:Foo {
    override convenience init() {
        self.init(a:"baz", b:42)
    }
    required init(a:String, b:Int) {
        super.init()
    }
}

< > >代码> >协议> <代码>强制< >代码>(A:String,B:INT)<代码> <强> >代码>要求/<代码> <强>初始化器,但对“方便”或“指定”不做任何事。

< P>如果您仍想这样做,您可以考虑在协议中添加静态函数:

protocol Zizo {
     static func make(withA a: String, b: Int) -> Self
}
当在类继承树中使用时,这确实有点麻烦