在swift中,Self.Type不能直接转换为扩展名为Objective-c类的AnyClass
我试图创build结构方法来创build正确的笔尖名称的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')
NSStringFromClass(self)
Cannot convert value of type 'Self.Type' to expected argument type 'AnyClass' (aka 'AnyObject.Type')
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
可以在许多上下文中使用(例如,类,结构,协议等),但是AnyClass
仅与类Self.Type
匹配。
在我的情况下,编译器应该知道Self
指向UIViewController
及其所有子类(因为它在UIViewController
扩展中),所以Self.Type
必须可以转换为AnyClass
。
我错过了什么,或者这是正确的行为,因为编译器不执行任何额外的Self
types分析?
这看起来像一个错误或(不必要的)限制,所以你可能会考虑在苹果提交一个错误报告。 它只发生于返回types为Self
types方法。 作为一个解决方法,你可以写
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!