![](/img/trans.png)
[英]Type 'X' does not conform to protocol 'Y' when using associatedtype / typealias
[英]Why does associatedtype not conform to protocols defined in its constraining protocol?
我正在尝试让我的 SwiftUI 视图更“可预览”,因此我正在使它们在其商店 (ViewModel) 上通用,这样我就可以更轻松地模拟它们。
考虑以下示例:
public protocol HomeViewStore: ObservableObject {
associatedtype AnimatableImageStoreType = AnimatableImageStore
var title: String { get }
var animatableImageStores: [AnimatableImageStoreType] { get }
var buttonTapSubject: PassthroughSubject<Void, Never> { get }
var retryTapSubject: PassthroughSubject<Void, Never> { get }
}
public protocol AnimatableImageStore: ObservableObject, Identifiable {
var imageConvertible: Data? { get }
var onAppear: PassthroughSubject<Void, Never> { get }
}
struct AnimatableImage<
AnimatableImageStoreType: AnimatableImageStore
>: View {
@ObservedObject private var store: AnimatableImageStoreType
public init(store: AnimatableImageStoreType) {
self.store = store
}
...
}
public struct HomeView<
HomeViewStoreType: HomeViewStore
>: View {
@StateObject private var store: HomeViewStoreType
public init(store: HomeViewStoreType) {
self._store = StateObject(wrappedValue: store)
}
public var body: some View {
VStack {
Text(store.title)
Button {
store.buttonTapSubject.send(())
} label: {
Text("API Call")
}
.background(Color(.accent))
.padding()
Button {
store.retryTapSubject.send(())
} label: {
Text("Retry")
.font(.monserrat(.bold, 14))
}
.padding()
List(store.animatableImageStores) { animatableImageStore in
AnimatableImage(store: animatableImageStore)
}
}
.background(Color(.accent))
}
}
该代码给我以下错误消息:
我的问题是,为什么在 HomeViewStore 协议中 HomeViewStoreType.AnimatableImageStoreType 不符合 AnimatableImageStore 协议,我将其限制为 AnimatableImageStore 协议,而 AnimatableImageStore 符合的 Identifiable 也是如此?
如果有人能告诉我实现这一目标的正确方法,我将不胜感激:)
此行不会将AnimatableImageStoreType
限制为AnimatableImageStore
:
associatedtype AnimatableImageStoreType = AnimatableImageStore
将=
替换为:
它将起作用:
associatedtype AnimatableImageStoreType: AnimatableImageStore
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.