我在开发时发现了一条奇怪的 Swift 编译器消息(我使用的是Swift 4.1(:
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 中的一个错误吗?还是我错过了什么?如果是错误:是因为代码段 (3( 不允许我进行弱引用,所以它是一个错误吗?还是因为编译器警告?还是两者兼而有之?如果我错过了什么:那是什么?
在 Swift 4.1 中,不可能将协议限制为特定类的子类。您可以从NSObjectProtocol
继承Foo
,这可能符合您的意图。
protocol Foo: NSObjectProtocol {
// ....
}
在 Swift 4.2 中,你写的是合法的 Swift,并且能做到你所期望的。
来自 Swift 公共 API:
public typealias AnyObject /// The protocol to which all class types implicitly conform.
因此,通过声明您的协议符合class
它会自动符合AnyObject