错误"Redundant constraint 'Self' : 'AnyObject'" - "任何对象"在哪里?



我在开发时发现了一条奇怪的 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

相关内容

最新更新