如何在swift中静态获取类类型

时间:2016-12-26 17:46:38

标签: swift

由于这个问题看似重复,我首先指出这不是要求如何从实例中获取类类型(答案是使用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)来获取类类型?类似于SelfClass(它们实际上没有编译)

1 个答案:

答案 0 :(得分:3)

我的猜测是你的整个问题都是红色鲱鱼,而type(of:self) 正好你想说什么。在这种情况下,问题仅在于var foo被声明为实例属性。当初始化实例属性时允许您说self时有一些特殊规则(正确地说,因为self正是初始化期间尚不存在的内容)。但是,正如我在其他地方所解释的那样,有办法解决这个问题;你可以把它变成一个计算实例属性,或者一个 lazy 实例属性,它由一个稍后要执行的函数初始化,然后你允许说type(of:self)