访问协议扩展的静态 属性
Access static property of protocol extension
我正在尝试构建一个公开静态 属性 的协议,然后在该协议的扩展中使用该静态 属性,但它似乎只有在我定义此静态 属性 在协议扩展中也是如此。
基本上是我要开始工作的代码:
protocol NibInstantiable: class {
static var bundle: Bundle? { get }
static var nibName: String { get }
}
extension NibInstantiable where Self: UIViewController {
// static var nibName: String {
// return ""
// }
static func instantiate() -> Self {
return Self(nibName: Self.nibName, bundle: Self.bundle ?? Bundle.main)
}
}
这在 Swift 2 中基本上按原样工作,但在 Swift 3 中不再如此。我可以通过取消注释 nibName
属性 在协议扩展中,但如果我忘记在实现此协议的 类 中定义此 属性,那将抑制编译器警告。
知道我错过了什么吗?
谢谢!
编辑:作为参考,这里是该代码的 Swift 2.3 版本,可以毫无问题地编译和运行:
protocol Instantiable {
static var bundle: NSBundle? { get }
static func instantiate() -> Self
}
extension Instantiable {
static var bundle: NSBundle? {
return NSBundle.mainBundle()
}
}
// MARK: With Nib
protocol NibInstantiable: Instantiable {
static var nibName: String { get }
}
extension NibInstantiable where Self: UIViewController {
static func instantiate() -> Self {
return Self(nibName: Self.nibName, bundle: Self.bundle ?? NSBundle.mainBundle())
}
}
这对我来说像是一个错误(请参阅相关错误报告 SR-2992) – the compiler thinks that there's a conflict between UIViewController
's nibName
实例 属性 和您的 NibInstantiable
协议的 nibName
静态 属性 要求。一个更简单的可重现示例是:
protocol Foo {
static var bar : String { get }
}
class Bar {
var bar = "" // commenting out this line allows the code to compile
}
extension Foo where Self : Bar {
static func qux() {
print(bar) // compiler error: Instance member 'bar' cannot be used on type 'Self'
}
}
一个简单的解决方法是重命名协议的 nibName
静态 属性 要求。
我正在尝试构建一个公开静态 属性 的协议,然后在该协议的扩展中使用该静态 属性,但它似乎只有在我定义此静态 属性 在协议扩展中也是如此。 基本上是我要开始工作的代码:
protocol NibInstantiable: class {
static var bundle: Bundle? { get }
static var nibName: String { get }
}
extension NibInstantiable where Self: UIViewController {
// static var nibName: String {
// return ""
// }
static func instantiate() -> Self {
return Self(nibName: Self.nibName, bundle: Self.bundle ?? Bundle.main)
}
}
这在 Swift 2 中基本上按原样工作,但在 Swift 3 中不再如此。我可以通过取消注释 nibName
属性 在协议扩展中,但如果我忘记在实现此协议的 类 中定义此 属性,那将抑制编译器警告。
知道我错过了什么吗? 谢谢!
编辑:作为参考,这里是该代码的 Swift 2.3 版本,可以毫无问题地编译和运行:
protocol Instantiable {
static var bundle: NSBundle? { get }
static func instantiate() -> Self
}
extension Instantiable {
static var bundle: NSBundle? {
return NSBundle.mainBundle()
}
}
// MARK: With Nib
protocol NibInstantiable: Instantiable {
static var nibName: String { get }
}
extension NibInstantiable where Self: UIViewController {
static func instantiate() -> Self {
return Self(nibName: Self.nibName, bundle: Self.bundle ?? NSBundle.mainBundle())
}
}
这对我来说像是一个错误(请参阅相关错误报告 SR-2992) – the compiler thinks that there's a conflict between UIViewController
's nibName
实例 属性 和您的 NibInstantiable
协议的 nibName
静态 属性 要求。一个更简单的可重现示例是:
protocol Foo {
static var bar : String { get }
}
class Bar {
var bar = "" // commenting out this line allows the code to compile
}
extension Foo where Self : Bar {
static func qux() {
print(bar) // compiler error: Instance member 'bar' cannot be used on type 'Self'
}
}
一个简单的解决方法是重命名协议的 nibName
静态 属性 要求。