错误“冗余约束'Self':'AnyObject'” - 哪里是`AnyObject`?

时间:2018-06-12 13:43:24

标签: swift

我在开发时发现了一个奇怪的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来自哪里?我要求NSObjectNSObject受到尊重:我无法声明class MyFoo: Foo { },因为它正确地抱怨它必须从NSObject继承?

这是Swift中的错误吗?或者我错过了什么?如果它是一个错误:它是一个错误,因为片段(3)不允许我采取弱引用?还是因为编译器警告?或两者?如果我遗失了什么:它是什么?

2 个答案:

答案 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