Self.Type 不能直接转换为 AnyClass in extension to objective-c class in swift

Self.Type cannot be directly converted to AnyClass in extension to objective-c class in swift

我正在尝试创建结构方法来创建具有正确笔尖名称的 UIViewController(以修复 iOS8 默认初始化程序问题)。为此,我添加了扩展名:

extension UIViewController {    
    class func create() -> Self {
        if #available(iOS 9.0, *) {
            return self.init()
        } else {
            let clsName = NSStringFromClass(self).componentsSeparatedByString(".").last!
            return self.init(nibName: clsName, bundle: nil)
        }
    }
}

但是编译器发出错误:Cannot convert value of type 'Self.Type' to expected argument type 'AnyClass' (aka 'AnyObject.Type') in NSStringFromClass(self)

要修复它,可以添加另一个扩展方法并将代码重写为:

extension UIViewController {
    private class var nibNameForInitializer:String {
        return NSStringFromClass(self).componentsSeparatedByString(".").last!
    }
    class func create_() -> Self {
        if #available(iOS 9.0, *) {
            return self.init()
        } else {
            return self.init(nibName: self.nibNameForInitializer, bundle: nil)
        }
    }
}

但是我想了解第一个变体的问题。

据我了解,返回Self的方法是一种泛型方法。 Self 可以在许多上下文中使用(例如 class、结构、协议等),但是 Self.Type 仅在 class 中匹配 AnyClass

在我的例子中,编译器应该知道 Self 指的是 UIViewController 及其所有子 classes(因为它在 UIViewController 扩展中),所以 Self.Type 必须可转换为 AnyClass

我是否遗漏了什么,或者这是正确的行为,因为编译器不会为 Self 执行任何额外的类型分析?

这看起来像是错误或(不必要的)限制,因此您可能 考虑向 Apple 提交错误报告。它只发生 对于具有 return 的类型方法,类型为 Self。作为解决方法,您可以编写

let clsName = NSStringFromClass(self as! AnyClass).componentsSeparatedByString(".").last!

它编译并且似乎按预期工作。

但是有一种更简单的方法可以得到相同的结果:

// Swift 2:
let clsName = String(self)
// Swift 3:
let clsName = String(describing: self)

也许这是一个错误,请尝试强制转换,这就是我必须让它工作的方法:

let clsName = NSStringFromClass(self as! AnyClass).componentsSeparatedByString(".").last!