我试图创建结构方法来创建具有正确的笔尖名称(修复iOS8默认初始化程序问题)的UIViewController。要做到这一点我已经添加扩展名:Self.Type不能直接转换为AnyClass扩展到Objective-C类在swift
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
执行任何其他类型分析,所以我错过了什么,或者它是正确的行为?
哇,恭喜你在几乎同一时间得到与我一样的答案haha – Knight0fDragon
对于Swift 3,最后一行应该是“let clsName = String(describe:self)”。 – RenniePet
@RenniePet:的确,谢谢。 –