swift 如何使方案符合可识别性

hrirmatl  于 2023-08-02  发布在  Swift
关注(0)|答案(1)|浏览(101)

我有过

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只是一个例子)。

vmjh9lq9

vmjh9lq91#

这能帮上忙吗
https://developer.apple.com/forums/thread/130177

import Foundation
import SwiftUI

class AnyIdentifiable<T>: Identifiable {
    var id: T { _id }
    private let _id: T
    init<U: Identifiable>(_ identifiable: U) where U.ID == T {
        _id = identifiable.id
    }
}
struct WidgetModel: Identifiable {
    var id: String?
}

struct ContentView: View {
    let models = [AnyIdentifiable<String>]()
    @State private var  model: AnyIdentifiable<String?>? = AnyIdentifiable(WidgetModel())
    var body: some View {
        //example 1
        ForEach(models) { _ in
        }
        //example 2
        .sheet(item: $model) { _ in
        }
    }
}

字符串
擦除模式的另一种实现在 Design Patterns with Swift,Florent Vilmart,Giordano Scalzo and Sergio De Simone 中提出,但我不知道这是否是您问题的解决方案。

相关问题