我在开发时发现了一条奇怪的Swift编译器消息(我正在使用SWIFT4.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中的一个bug吗?还是我遗漏了什么?,如果它是一个bug:它是一个bug,因为代码片段(3)不允许我接受弱引用吗?还是因为编译器的警告?还是两者都有?如果我错过了什么:这是什么?
发布于 2018-06-12 13:48:04
在Swift 4.1中,不可能将协议限制为特定类的子类。您可以从Foo继承NSObjectProtocol,这可能与您的意图相匹配。
protocol Foo: NSObjectProtocol {
// ....
}在Swift 4.2中,你写的是合法的Swift,做你期望的事情。
发布于 2018-06-12 13:47:35
来自Swift公共API:
public typealias AnyObject /// The protocol to which all class types implicitly conform.
因此,通过声明您的协议符合class,它将自动符合AnyObject。
https://stackoverflow.com/questions/50818763
复制相似问题