我有过
protocol Model: Identifiable where ID == String? {
var id: Self.ID { get set }
}
struct WidgetModel: Model {
var id: String?
}
struct ContentView: View {
let models = [any Model]()
let model : any Model = WidgetModel()
var body: some View {
//example 1
ForEach(models) { _ in
}
//example 2
.sheet(item:model) {
}
}
}
字符串
但会产生编译器错误
类型“any Model”不能符合“Identifiable”
根据上面的讨论,编译器可能会遇到困难,因为它不知道ID的类型,但我明确告诉它它将是String
Using SwiftUI ForEach to iterate over [any Protocol] where said protocol is Identifiable
如果这是一个快速的限制在这一点上,我如何才能解决这个问题?我需要一个协议数组,因为本质上我是在迭代混合的具体类型。我在那个线程中看到过一个解决方案,你可以扩展ForEach来克服这个问题,但这不是一个选择,因为SwiftUI在很多其他地方需要一个可识别的,而不允许你指定id(.sheet只是一个例子)。
1条答案
按热度按时间vmjh9lq91#
这能帮上忙吗
https://developer.apple.com/forums/thread/130177
字符串
擦除模式的另一种实现在 Design Patterns with Swift,Florent Vilmart,Giordano Scalzo and Sergio De Simone 中提出,但我不知道这是否是您问题的解决方案。