如何将self.dynamicType转换为typealias

时间:2017-04-21 08:59:14

标签: swift abstraction swift-protocols

基本上我想为UIViewController或任何其他默认的swift类添加一个typealias。这背后的原因是我想抽象我的代码,以便我可以通过使用this代替self.dynamicType来访问一些静态函数

extension UIViewController {
    typealias this = TheClassThatSubclassedThis
}

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

    static func doStaticStuff() {
        ...
    }
}

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

protocol CanAccessStaticSelf {
    typealias this
}

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

但有更有效的方法吗?例如,只是通过子类化某个类或扩展超类?

像这样的例子

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)
    }
}

2 个答案:

答案 0 :(得分:1)

请改为尝试:

protocol CanAccessStaticSelf {
    typealias this = Self
}

......但是你想要达到的目标看起来有些令我困惑; - (

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

例如:

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

答案 1 :(得分:0)

无法通过此访问。 但是你可以通过" UIViewController.defaultNibName"来访问。