Cocoa 使Swift类符合需要init的协议
我在Cocoa 使Swift类符合需要init的协议,cocoa,swift,protocols,Cocoa,Swift,Protocols,我在Swift中有以下协议: protocol FooConvertible{ typealias FooType init(foo: FooType) } 我可以使Swift类在类定义中符合它: class Bar: FooConvertible { var baz: String = "" required init(foo: String){ baz = foo } } 到目前为止还不错。但是,当我试图使一个类在扩展中与之一致时
Swift
中有以下协议
:
protocol FooConvertible{
typealias FooType
init(foo: FooType)
}
我可以使Swift
类在类定义中符合它:
class Bar: FooConvertible {
var baz: String = ""
required init(foo: String){
baz = foo
}
}
到目前为止还不错。但是,当我试图使一个类在扩展中与之一致时,问题就出现了(对于Cocoa类,这是我唯一的选择,因为我没有源代码):
在该语言的以前版本中
它被移除的原因是什么
这意味着所有XXXLiteralConvertible协议都被禁止进入Cocoa类 您有没有可能尝试创建以下内容:
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
现在将知道fooConverable
的所有初始化。
如果是这样,我很高兴能帮上忙。:) 这一事实已经被很清楚地解释了。它说你可以在Swift类中添加便利init,但不能在Cocoa类中添加便利init?你也不能这样做。你的例子没有编译。糟了,我在操场上直到现在才发现任何编译器错误。你说得对,我将修改这个问题。仅供参考,这里有一个关于
XXXLiteralConvertible
方面的讨论:
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
}
}