我在 Swift
中有以下协议(protocol)
:
protocol FooConvertible{
typealias FooType
init(foo: FooType)
}
我可以让 Swift
类在类定义中符合它:
class Bar: FooConvertible {
var baz: String = ""
required init(foo: String){
baz = foo
}
}
到目前为止一切顺利。但是,当我尝试在扩展中使一个类符合它时,问题就出现了(对于 Cocoa 类,这是我唯一的选择,因为我没有源代码):
class Baz {
var baz = ""
}
extension Baz: FooConvertible{
required convenience init(foo: String) { // Insists that this should be in the class definition
baz = foo
}
}
extension NSURL: FooConvertible{
required convenience init(foo: String) { // this also fails for the same reason
}
}
这used to be possible , 在以前的语言版本中
它被删除的原因是什么?
这意味着 Cocoa 类禁止所有 XXXLiteralConvertible 协议(protocol)!
最佳答案
如果您尝试创建这样的东西:
protocol FooConvertible : class {
typealias FooType
var baz : String { get set } // protocol extensions inits may need to know this
init(foo: FooType) // this is your designated initializer
}
extension FooConvertible {
// init(foo: String) {
// self.init(foo: foo)
// baz = foo
// }
// you can't do this because it could call it self recursively
init(num: Int) { // this init will call your designated init and can instantiate correctly
self.init(foo: "\(num)")
}
}
class Baz {
var baz = ""
}
class Bar: FooConvertible {
var baz: String = ""
required init(foo: String) { // designated initializer
baz = foo
}
}
Baz
现在将知道 FooConvertible
的所有初始化。
如果是这样,我很高兴能提供帮助。 :)
关于cocoa - 使 Swift 类符合需要 init 的协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26876858/