访问协议扩展的静态 属性

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 静态 属性 要求。