访问协议扩展的静态属性

时间:2016-12-26 10:37:17

标签: swift swift3 swift-extensions

我正在尝试构建一个暴露静态属性的协议,然后在该协议的扩展中使用该静态属性,但它似乎只有在我在协议扩展中定义这个静态属性时才有效。 基本上我正在努力工作的代码:

var express = require('express');
var app = express();
app.use('/reco', express.static(__dirname + '/src/public'));
app.listen(8080, function() { console.log('started');});

这在Swift 2中基本上是按原样运行的,但在Swift 3中不再是这种情况。我可以通过取消注释协议扩展中的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.3版本,编译和工作没有任何问题:

nibName

1 个答案:

答案 0 :(得分:1)

这看起来像是一个错误(请参阅相关的错误报告SR-2992) - 编译器认为UIViewController 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静态属性要求。