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!
我正在尝试创建结构方法来创建具有正确笔尖名称的 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!