在 ViewModel 我有:
public var models: [any Tabbable]
Tabbable 以
public protocol Tabbable: Identifiable {
associatedtype Id
var id: Id { get }
/// ...
}
在我的 ViewModel 中的 Swift 中,我可以使用 Array.forEach 來:
models.forEach { _ in
print("Test")
}
但在 SwiftUI 中,我不能使用 ForEach 來:
ForEach(viewModel.models) { _ in
Text("Test")
}
由于:
型別 'any Tabbable' 不能符合 'Identifiable'
有什么建議么?這是 Swift 5.7。我需要回去制作像 AnyTabbable 這樣的東西嗎?提前致謝。
uj5u.com熱心網友回復:
以 Playground 的形式考慮這個例子:
import UIKit
import SwiftUI
public protocol Tabbable: Identifiable {
associatedtype Id
var id: Id { get }
var name : String { get }
}
struct TabbableA : Tabbable{
typealias Id = Int
var id : Id = 3
var name = "TabbableA"
}
struct TabbableB : Tabbable {
typealias Id = UUID
var id : Id = UUID()
var name = "TabbableB"
}
struct ViewModel {
public var models: [any Tabbable]
}
let tabbableA = TabbableA()
let tabbableB = TabbableB()
let models: [any Tabbable] = [tabbableA, tabbableB]
struct ContentView {
@State var viewModel : ViewModel = ViewModel(models: models)
var body : some View {
ForEach(viewModel.models) { model in
Text(model.name)
}
}
}
在這種情況下,我們有一個型別TabbableA,其中每個實體都有id一個整數屬性(為了示例,他們只使用“3”,但它是重要的型別)。在TabbableB每個實體中id都有一個 UUID。然后我創建一個陣列,其中一項是 的實體,TabableA另一項是 的實體TabbableB。陣列的型別是[any Tabbable]。
然后我嘗試ForEach在陣列上使用。但是陣列中的一些元素使用Intids,有些使用UUIDids。系統不知道使用什么型別來唯一標識視圖。Ints并且UUIDs不能直接相互比較以確定相等性。雖然進入陣列的每個專案都是Tabbable,因此符合Identifiable,但從陣列出來的元素(每個元素都是 型別any Tabbable)不符合Identifiable。所以系統拒絕了我的代碼。
uj5u.com熱心網友回復:
您可以為 id(或任何唯一變數)提供 KeyPath:指定如何檢索IDin 的引數ForEach。這是因為其中的所有專案都ForEach必須是唯一的。您可以創建一個符合您的協議的結構。在那一刻它應該作業。第二個選項是Identifiable從協議中洗掉,然后您可以直接使用它。
public protocol Tabbable {
var id: String { get }
/// ...
}
public var models: [Tabbable]
ForEach(viewModel.models, id: \.id) { _ in
Text("Test")
}
或者
public protocol TabbableType: Identifiable {
associatedtype Id
var id: Id { get }
/// ...
}
struct Tabbable: TabbableType {
var id: String { get }
/// ...
}
public var models: [Tabbable]
ForEach(viewModel.models) { _ in
Text("Test")
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/496752.html
