gpt4 book ai didi

ios - 无法将泛型类型的值转换为关联类型的预期参数

转载 作者:可可西里 更新时间:2023-11-01 02:06:19 26 4
gpt4 key购买 nike

假设我有一个协议(protocol):

protocol Foo:Hashable, Comparable {}

还有一个将这个人作为泛型的结构:

struct UsingFoo<T:Foo> {}

到目前为止一切顺利。假设我想在第二个协议(protocol)上使用 Foo:

protocol Bar {
associatedtype FooType:Foo
func doSomething(with:UsingFoo<FooType>)
}

然后在类上使用 Bar:

class UsingBar<F:Foo>:Bar {
typealias FooType = F
func doSomething(with: UsingFoo<F>) {}
}

现在说我想带这些人去参加派对:

class FooBarParty<F:Foo, B:Bar>: NSObject {
var b:B
init(b:B) {
self.b = b
// interestingly, this line below won't compile
// self.b = UsingBar<F>.init()
}

func thisWillCompile () {
UsingBar<F>.init().doSomething(with: UsingFoo<F>.init())
}

func thisWontCompile() {
b.doSomething(with: UsingFoo<F>.init())
}

func thisAlsoWont (anotherB:B) {
anotherB.doSomething(with: UsingFoo<F>.init())
}
}

编译器说:

Cannot convert value of type 'UsingFoo<F>' to expected argument type 'UsingFoo<_>'

问题是:我怎样才能使用 Bar 类型的属性?一如既往,非常感谢任何评论

编辑:感谢接受的答案,我发现我应该指定 FooType。它看起来像这样:

class FooBarParty<F:Foo, B:Bar> where B.FooType == F { ... }

最佳答案

所以这里的问题基本上是:

Why can't I use an instance of B to call doSomething(UsingFoo<F>()), but I can with an instance of UsingBar<F>

问题在于您的关联类型 - FooType .

doSomething方法说它只接受 UsingFoo<FooType> 类型的参数.我们知道在 UsingBar<F> , FooTypeF .所以UsingBar<F>().doSomething需要 UsingFoo<F> .而在 thisWillCompile , 你给它一个 UsingFoo<F> !有用!

现在你得到了另一个随机实例 B并调用doSomething .它需要什么参数? UsingFoo<FooType> ,你可能会说。那么,什么是FooType这里?我们不知道!可以是F , 或 String如果我们在这里添加这个扩展:

extension String: Foo { }

FooType可以是任何实现 Foo 的东西.它不需要是 F .但是你传递给它一个 UsingFoo<F> .这就是它不起作用的原因!

正如你所说,这条线也不起作用:

self.b = UsingBar<F>.init()

您需要注意 B 不是 Bar .它可以是任何实现 Bar 的类型, 不一定 UsingBar<F> .你所做的本质上是:

class A {}
class B: A {}
class C: A {}
let obj: B = C()

这就是无法编译的原因。

关于ios - 无法将泛型类型的值转换为关联类型的预期参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42696579/

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