如何将 self.dynamicType 变成类型别名

How to make self.dynamicType into a typealias

基本上我想为 UIViewController 或任何其他默认 swift classes 添加类型别名。这背后的原因是我想抽象我的代码,这样我就可以通过使用 this 而不是 self.dynamicType

来访问一些静态函数
extension UIViewController {
    typealias this = TheClassThatSubclassedThis
}

class DetailViewController: UIViewController {
    func doStuff() {
        this.doStaticStuff()
    }

    static func doStaticStuff() {
        ...
    }
}

我知道这可以通过创建 protocol 实现,然后只需将所述协议实现到 class 我想实现它,就像这样

protocol CanAccessStaticSelf {
    typealias this
}

class DetailVC: UIViewController, CanAccessStaticSelf {
    typealias this = DetailVC
}

但是有没有更有效的方法来做到这一点?例如,通过 subclassing 某个 class 或扩展 superclass?

例如这样

extension UIViewController {
    public static var defaultNibName: String {
        return self.description().componentsSeparatedByString(".").dropFirst().joinWithSeparator(".")
    }
}

class DetailVC: UIViewController, CanAccessStaticSelf {
    func doSomeStuffAgain() {
        // no other code just subclass and I can access self.dynamicType as just `this`
        print(this.defaultNibName)
    }
}

无法通过此访问。 但您可以通过 "UIViewController.defaultNibName".

访问

试试这个:

protocol CanAccessStaticSelf {
    typealias this = Self
}

...但是您想要实现的目标让我有些困惑;-(


感谢 this proposal from Erica Sadun 我们都可以在不久的将来使用 Self 关键字。

例如:

class MyClass {
    static func staticMethod() { ... }
    func instanceMethod() {
        MyClass.staticMethod()
        Self.staticMethod()
     }
}