我在开发时发现了一个奇怪的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)不允许我采取弱引用?还是因为编译器警告?或两者?如果我遗失了什么:它是什么?
答案 0 :(得分:1)
不可能将协议约束为Swift 4.1中特定类的子类。您可以从Foo
继承NSObjectProtocol
,这可能与您的意图相符。
protocol Foo: NSObjectProtocol {
// ....
}
在Swift 4.2中,您所写的内容是合法的Swift并且符合您的期望。
答案 1 :(得分:0)
来自Swift公共API:
public typealias AnyObject /// The protocol to which all class types implicitly conform.
因此,通过声明您的协议符合class
,它会自动符合AnyObject