首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误“冗余约束'Self‘:'AnyObject'”-’AnyObject‘在哪里?

错误“冗余约束'Self‘:'AnyObject'”-’AnyObject‘在哪里?
EN

Stack Overflow用户
提问于 2018-06-12 13:43:23
回答 2查看 1.2K关注 0票数 4

我在开发时发现了一条奇怪的Swift编译器消息(我正在使用SWIFT4.1):

代码语言:javascript
复制
protocol Foo: class where Self: NSObject { // (1)
    // Redundant constraint 'Self' : 'AnyObject'
}

这里发生了什么事?

--首先,这不是多余的。

代码语言:javascript
复制
protocol Foo: class { } // (2)

我有一个任何对象都可能遵守的协议,甚至不是从NSObject派生的对象。但是我可以创建弱引用:weak var f: Foo?是可以的。

另一方面,当我写

代码语言:javascript
复制
protocol Foo where Self: NSObject { } // (3)

我有一个不能产生弱引用的协议:weak var f: Foo?是编译时错误。

第二,AnyObject 是从哪里来的?--我要的是NSObject。但是NSObject是受尊重的:我不能声明class MyFoo: Foo { },因为它正确地抱怨它必须从NSObject继承

这是Swift中的一个bug吗?还是我遗漏了什么?,如果它是一个bug:它是一个bug,因为代码片段(3)不允许我接受弱引用吗?还是因为编译器的警告?还是两者都有?如果我错过了什么:这是什么?

EN

回答 2

Stack Overflow用户

发布于 2018-06-12 13:48:04

在Swift 4.1中,不可能将协议限制为特定类的子类。您可以从Foo继承NSObjectProtocol,这可能与您的意图相匹配。

代码语言:javascript
复制
protocol Foo: NSObjectProtocol { 
    // ....
}

在Swift 4.2中,你写的是合法的Swift,做你期望的事情。

票数 2
EN

Stack Overflow用户

发布于 2018-06-12 13:47:35

来自Swift公共API:

public typealias AnyObject /// The protocol to which all class types implicitly conform.

因此,通过声明您的协议符合class,它将自动符合AnyObject

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50818763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档