我不明白的问题,因为这段代码看起来好像没什么问题:
class Foo {
var str = "hi";
func refresh() {
println(self.str);
}
}
class Bar: Foo {
override init() {
super.init()
str = "bar"
let zed = Zed(parent: self)
}
}
class Baz: Foo {
override init() {
super.init()
str = "baz"
let zed = Zed(parent: self)
}
}
class Zed {
var parent: Foo?; // I want it to work for both Bar and Baz
init(parent: Foo) {
self.parent = parent
self.parent?.refresh()
}
}
let b = Bar() // prints bar
let c = Baz() // prints baz
如果问题是如何确保美孚的没有其他子类允许为捷思锐的父母:有没有办法来指定斯威夫特的类型约束的“或”约束,但你可以通过在酒吧和巴兹相同的协议,并指定该协议为parent
的类型:
protocol CanRefresh
{
func refresh()
}
extension Bar : CanRefresh
{
}
extension Baz : CanRefresh
{
}
class Zed {
var parent: CanRefresh?; // I want it to work for both Bar and Baz
init(parent: CanRefresh) {
self.parent = parent
self.parent?.refresh()
}
}
这样ÿ您可以明确列出Zed支持的类(但这是一个非常糟糕的API设计;您应该发布协议,并让任何愿意遵守该协议的人遵守)。
所以你想访问Bar和Baz类的'parent'? – Padarom 2014-12-03 07:56:59
'parent'应该是'Bar'或'Baz'类。 – switz 2014-12-03 07:59:12
那什么不起作用?这对我来说看起来很好...... – Grimxn 2014-12-03 08:15:23