当静态成员初始化实例属性时,为什么子类类型不可用?

时间:2017-11-27 21:43:54

标签: swift

运行以下代码时,// start when mousedown Observable.fromEvent(element, 'mousedown') .subscribe(() => { Observable.fromEvent(element, 'mousemove') // finish when mouseup .takeUntil(Observable.fromEvent(element, 'mouseup')) .subscribe(() => {/*do something on mousemove*/}); }); 内的selfdefaultModuleName,当人们期望它为ReactViewController时。为什么呢?

FooViewController

1 个答案:

答案 0 :(得分:0)

您只需要传递self而不是type(of: self),并使用String(describing:)初始值设定项。

class ClassA {

    static var className: String {
        return String(describing: self)
    }

}

class ClassB: ClassA { }

print(ClassB.className) // prints "ClassB"

编辑:澄清var moduleName: String = defaultModuleName更新。假设我将这一行添加到上面的例子中(同样的想法):

class ClassA {

    // This is a property of ClassA -> it gets implicitly initialized
    // when ClassA does -> it uses ClassA.className for its value
    var instanceClassName = className

    static var className: String {
        return String(describing: self)
    }

}

class ClassB: ClassA { }

print(ClassB().instanceClassName) // prints "ClassA"

这个新instanceClassName不是静态的,因此它是ClassA上的实例属性。因此在初始化ClassA时初始化(初始化ClassB时)。使用对ClassA的引用,在className内设置的属性,将打印出ClassA