我正在尝试创建结构方法来创建具有正确 nib 名称的 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)
.
要修复它,可以添加另一种扩展方法并将代码重写为:
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
可以在许多上下文中使用(例如类、结构、协议等),但仅Self.Type
匹配AnyClass
类。
在我的情况下,编译器应该知道Self
引用UIViewController
及其所有子类(因为它在UIViewController
扩展内部),所以Self.Type
必须可以转换为AnyClass
.
我是否遗漏了什么,或者这是正确的行为,因为编译器不执行任何额外的类型分析Self
?