gpt4 book ai didi

ios - Swift 协议(protocol)符合 : Candidate has non-matching type

转载 作者:IT王子 更新时间:2023-10-29 05:47:57 31 4
gpt4 key购买 nike

我试图用 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com