在我开发过程中(我使用的是Swift 4.1),我遇到了一个奇怪的Swift编译器消息:
protocol Foo: class where Self: NSObject { // (1)
// Redundant constraint 'Self' : 'AnyObject'
}
这里正在发生什么?
首先,这并不是多余的。当我写下这句话时,
protocol Foo: class { } // (2)
我有一个协议,任何对象都可以潜在地符合它,即使是不从 NSObject
派生的对象。但是我可以创建弱引用:weak var f: Foo?
是可以的。
另一方面,当我写下
protocol Foo where Self: NSObject { } // (3)
我有一个协议,无法生成弱引用:
weak var f: Foo?
是编译时错误。其次,
AnyObject
是从哪里来的?我要求的是 NSObject
。尽管尊重 NSObject
:我无法声明一个 class MyFoo: Foo { }
,因为它正确地抱怨它必须继承自 NSObject
?这是 Swift 的一个 bug 吗?还是我漏掉了什么?如果这是一个 bug:它是因为代码段(3)不让我使用弱引用吗?还是因为编译器警告?还是两者都有?如果我漏掉了什么:那是什么?
where Self: NSObject
约束,直到它支持),请参见https://dev59.com/RFYO5IYBdhLWcg3wKemM#50647762。 - Hamishprotocol Foo where Self : NSObject {}
,weak var f: Foo?
无法编译,也不能像func takesAFoo(_ foo: Foo) { print(foo.superclass as Any) }
那样。据我所知,这仍然是尚未完全实现的东西。 - Hamish