gpt4 book ai didi

ios - 类型 X 不继承自 Y

转载 作者:行者123 更新时间:2023-11-28 11:22:38 25 4
gpt4 key购买 nike

以下 Swift 代码在最后一行产生此错误:Type 'E' does not inherit from 'C<Self>' .不确定这里发生了什么。任何线索将不胜感激。

class C<T> {}

protocol P {
typealias E : C<Self>
}

class A : P {
typealias E = C<A>
}

class S<U : P> {}
class C2<T> : S<A> {}

更新:我简化了损坏的示例。旧版本(milos 的回答所指)可以在这个问题的编辑历史中找到。

最佳答案

我已经重命名了你的标识符以便我考虑它们:

protocol P {
typealias E : C<Self>
}

class A : P {
typealias E = C1<Any>
}

class B : P {
typealias E = C2<Any>
}

class C<T> {}
class C1<T> : C<A> {}

class S<T, U : P> : C<T> {} // <-- mark!
class C2<T> : S<B, A> {}

这最终应该会解决,而且几乎会解决。实际上,您想要的是:

class B : P {
typealias E = C<B> // which is what P requires (same with class A)
}

但是,在标记的行上,您定义了 class S你要求编译器检查 U : P 的类型然后通过 B作为要检查的具体类型。不幸的是,此时B符合 P仍未解决(即它本身是根据 C2 : S : C 定义的,这是您要使用 U : P 的地方)。删除 : PU : P删除错误,尽管这可能不是您想要的。再一次,根据您的需要,可能有任意数量的解决方案:)

编辑

以下是对@igul222 大大简化的代码示例的回应。但是,我仍然认为,编译器只是返回一条不太有用的错误消息,这实际上是由递归类型定义引起的。例如,如果您定义一个 enum就其本身而言:

enum E {
case C(E) // error: recursive value type 'E' is not allowed
}

现在,这可能也是以下问题:

class C<T> {}

protocol P {
typealias E : C<Self>
var c: E { get }
}

final class A : P {
typealias E = C<A>
var c: E { return E() }
}
// --> error: type 'A' does not conform to protocol 'P'
// --> note: protocol requires property 'c' with type 'E'
// --> note: candidate has non-matching type 'E'

...这也不起作用(你的要点的一个版本):

class C<T> {}

protocol P {
typealias E : C<Self>
}

final class A : P {
typealias E = C<A>
}

class X<U : P> {}

X<A>() // --> error: type 'E' does not inherit from 'C<`Self`>'

...或者这个:

class C<T> {}

protocol P {
typealias E : C<Self>
}

final class A : P {
typealias E = C<A>
}

let a = A()

func f<T: P>(T) {}

f(a) // --> error: 'A' is not identical to '`Self`'

编译器似乎在说 SelfC<Self>还没有A ,即 A还不是吗SelfA它必须符合 P这又是悬而未决的 C<Self>退房...但以下工作因为A不再根据自身定义关联类型:

class C<T> {}

protocol P {
var c: C<Self> { get }
}

final class A : P {
typealias E = C<A> // just a typealias, no longer an associated type
var c: E { return E() }
}

某些函数式编程模式需要递归定义类型,因此在 Swift 中拥有它可能会很好。然而,目前,我不确定是否可以有用地符合具有 T<Self> 形式的关联类型的协议(protocol)。 ,即使编译器允许它的定义......否则,这一切都应该只在运行时工作。

编辑2

我刚刚升级到 Xcode 6.1 GM Seed,情况发生了变化!以下代码片段以前不会编译,现在可以编译并运行良好!

protocol A {
var b: B? { get set }
}

protocol B {
var a: A? { get set }
}

class Ca: A {
var b: B?
}

class Cb: B {
var a: A?
}

let a = Ca() // --> {nil}
let b = Cb() // --> {nil}

a.b = b // --> {{{...}}}
b.a = a // --> {{{...}}}

但是,此改进并未扩展到递归定义的关联类型。

关于ios - 类型 X 不继承自 Y,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26108696/

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