由于这个问题看似重复,我首先指出这不是要求如何从实例中获取类类型(答案是使用type(of:)
)。
protocol Owner {
static func name() -> String
}
extension Owner {
static func name() -> String {
return "\(self)"
}
}
class Foo {
var ownerName: String
init(with owner: Owner.Type) {
ownerName = owner.name()
}
}
class Bar: Owner {
var foo = Foo(with: Bar.self)
}
上面的代码很简单,但想象我想将类Bar
重命名为BarBar
,然后我需要手动将foo
的初始化更改为Foo(with: BarBar.self)
。是否可以使用任何关键字代替ClassName.self
(例如Bar.self
BarBar.self
)来获取类类型?类似于Self
或Class
(它们实际上没有编译)
答案 0 :(得分:3)
我的猜测是你的整个问题都是红色鲱鱼,而type(of:self)
正好你想说什么。在这种情况下,问题仅在于var foo
被声明为实例属性。当初始化实例属性时允许您说self
时有一些特殊规则(正确地说,因为self
正是初始化期间尚不存在的内容)。但是,正如我在其他地方所解释的那样,有办法解决这个问题;你可以把它变成一个计算实例属性,或者一个 lazy 实例属性,它由一个稍后要执行的函数初始化,然后你是允许说type(of:self)
。