gpt4 book ai didi

Swift:无法识别泛型的类型协议(protocol)

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

长期倾听者,第一次来访者。

我收到以下错误:

Cannot convert value of type MyClass<Model<A>, OtherClass> to expected argument type MyClass<Protocol, OtherClass>

尽管 MyClass<T>符合 Protocol

我附上了一个可以在 Playgrounds 中运行的片段,它类似于我实际想要实现的目标。

protocol DisplayProtocol {
var value: String { get }
}

class DataBundle<T: CustomStringConvertible>: DisplayProtocol {
var data: T
var value: String {
return data.description
}

init(data: T) {
self.data = data
}
}

class Mapper<DisplayProtocol, Data> {
// ...
}

class MapperViewModel<Data> {
let mapper: Mapper<DisplayProtocol, Data>

init(mapper: Mapper<DisplayProtocol, Data>) {
self.mapper = mapper
}
}

let dataBundle = DataBundle<Int>(data: 100)
let mapper = Mapper<DataBundle<Int>, Bool>()
let viewModel = MapperViewModel<Bool>(mapper: mapper) // <- This fails w/error

这是预期的行为吗?如果是的话,感觉就像是违反了允许我拥有 DisplayProtocol 的契约(Contract)。作为 Mapper 中的一种类型.

最佳答案

这是因为 Swift 泛型在参数方面是不变的。因此 MyClass<B>MyClass<A> 不兼容即使BA 兼容(子类、协议(protocol)一致性等)。所以是的,不幸的是,这种行为是预期的。

在您的特定情况下,如果您想保留当前架构,您可能需要使用具有关联类型和类型删除器的协议(protocol)。

关于Swift:无法识别泛型的类型协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48956517/

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