- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我试图用 AnyObject 类型的某些属性定义一个协议(protocol),然后在符合该协议(protocol)的类中,属性类型是 SomeClass。但是,这返回了编译器错误。我不得不将类中的类型更改为 AnyObject。如何在协议(protocol)定义中使用父类(super class)并将子类用作属性类型?
谢谢!
protocol TestProtocol {
var prop: [AnyObject] {get}
}
class Test: TestProtocol {
var prop = [SomeClass]() //compiler error
var prop = [AnyObject]() //this will work
}
最佳答案
数组是一种不必要的复杂化,所以让我们删除它并考虑一个简单的类型。这是不合法的:
protocol TestProtocol {
var prop: AnyObject {get}
}
class SomeClass {}
class Test: TestProtocol {
var prop : SomeClass = SomeClass() // error
}
问题是协议(protocol)声明完全按照字面意思说,任何声称采用 TestProtocol 的人都必须拥有 prop
AnyObject 类型 的属性——而不仅仅是 符合 AnyObject。
如果您对此感到惊讶,您可能会混淆类型的实例和类型本身。确实可以在需要 AnyObject 的实例 的地方使用 SomeClass 的实例。但是类型自身并不是这样工作的;当协议(protocol)要求类型 AnyObject 时,您不能替换类型 SomeClass。
为了更清楚地看到这一点,请注意这确实编译得很好:
protocol TestProtocol {
var prop: AnyObject {get}
}
class SomeClass {}
class Test: TestProtocol {
var prop : AnyObject = SomeClass() // changing the declared _type_
}
编译,正如你已经发现的那样;但是,正如您也说过的,这不是您想要的。那么如何做你想做的呢?
好吧,在 Swift 中,您表达指定符合协议(protocol)类型的类型的概念的方式是通过具有约束的泛型。这就是你得到的答案所做的。协议(protocol)声明中的 typealias
可以是制作通用协议(protocol)的一种方式。泛型可以有一个约束,例如所讨论的类型应符合协议(protocol)或从类继承。因此,这是合法的,也是您正在寻找的解决方案:
protocol TestProtocol {
typealias T:AnyObject // generic
var prop: T {get}
}
class SomeClass {}
class Test: TestProtocol {
var prop : SomeClass = SomeClass() // :)
}
typealias T:AnyObject
行表示 T 必须是符合 AnyObject 的类型,这恰好是您要尝试的说。
关于ios - Swift 协议(protocol)符合 : Candidate has non-matching type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34937520/
我正在使用 AutoComplete API Material UI。有一个 的对象top100电影其中包含电影的标题和年份。如果我使用 top100Film.title 搜索,我的自动完成工作正常如
我试图显示位于拉特兰县,只有得票高于 0。现在,它仅显示拉特兰县的所有投票。 https://jsfiddle.net/jeffd/yqbwaxts/3/ https://99centbeats.co
const pc1 = new RTCPeerConnection(null); const pc2 = new RTCPeerConnection(null); async function cal
当我尝试运行我的游戏时,我目前遇到以下错误的问题。我试图理解以下错误的含义,但我发现很难理解。我相信有不止一个错误,但我不知道去哪里找。我很想得到你的帮助! [armeabi] Compile++ t
我正在写一个自定义键盘,我想使用候选人。但是候选 View 设置为一定高度,这对我的需要来说太小了。我似乎无法设置候选人的高度。如果我将高度设置为 certine dp,我会得到半黑屏。 谢谢! 最佳
您好,我希望得到一些安装 rubygems 的帮助。这就是我尝试时发生的情况。 “ruby-full”已经安装。我该如何解决?这是什么问题? $ sudo apt-get install ruby
我新写了一个简单的聊天应用程序,但我不太了解ICE Candidates的背景。 当对等方创建连接时,他们会获得 ICE 候选者,并交换它们并设置他们最终到达对等连接。 所以我的问题是,ICE 候选者
按照此tutorial (对于初学者) 我创建了提供者和应答者,我使用了 onicecandidate() function onicecandidate(event) { if (!p
#include #include #include #include using namespace std; struct Node1 { unsigned int vertex;
在 CEF3 中与 WebRTC 应用程序通话期间,出现以下错误。我做了很多分析但无法弄清楚这个问题的原因/解决方案..请提出问题所在以及解决方案。 1448447657717 - WebRtcAda
我正在使用 huggingface transformers 库开发法语问答模型。我使用的是预训练的 CamemBERT 模型,它与 RoBERTa 非常相似,但适用于法语。 目前,我能够使用 tra
我正在尝试在 ubuntu 中安装 nodejs,我需要使用 curl 但它不允许我安装 curl每次我尝试安装它时都会显示此错误 正在读取包列表...完成构建依赖树 正在读取状态信息...完成包 c
我在浏览器控制台中遇到的错误(仅出现在 Chrome 中,Firefox 中没有错误)是错误:无法在“RTCPeerConnection”上执行“addIceCandidate”:无法添加 ICE 候
概述 我正在尝试将 lambda 传递给采用模板函数类型的模板函数。编译时出现错误 candidate template ignored: could not match... . 但是,当我尝试将相
我正在尝试发送地址 this issue ,实际上是由 this other stackoverflow question 提出的与callwith的不同行为有关和 samewith 。后者似乎定义得
我正在做一个投票系统,希望投票系统循环直到用户输入0,然后输出获胜的候选人 两个类 package javaexamcode; import java.util.Scanner; pub
我安装了 Ubuntu 16.04 LTS(Xenial 版本)。我需要将 mpich2 软件包安装到我的系统上,但是当我运行 sudo apt-get install mpich2 时,出现以下错误
正如我的 Chrome 开发人员工具所指出的,什么是第一个有意义的绘画 (FMP) 候选者?这与第一个有意义的油漆有什么不同? 如您所见,黄线是 FMP,前两个标记为“候选人”,最后一个只是 FMP。
请注意,我已阅读并将答案应用于:Calling C++ member function from Luabind causes "No matching overload found" ,但这并没有解
上下文:我正在尝试设置 mysql 复制,一主一从。我在 mysql 5.6 中使用新的 GTID 方法,以及用于自动故障转移的 mysql 实用程序。 我能够设置主节点 M 和从节点 S 的复制。
我是一名优秀的程序员,十分优秀!