foreach - NSOrderedSet 和 SwiftUI ForEach
问题描述
我正在尝试使用 CoreData 和 SwiftUI 并有两个实体;狗和步行。Dog 之间是一对多的关系
public class Dog: NSManagedObject, Identifiable {
@NSManaged public var name: String?
@NSManaged public var walks: NSOrderedSet?
}
和走
public class Walk: NSManagedObject, Identifiable {
@NSManaged public var date: Date?
@NSManaged public var dog: Dog?
}
我遇到的问题是在列表中显示选定狗的所有步行。下面的 WalksView 将显示所有当前的 walk
struct WalksView: View {
@ObservedObject var dogWalksVM:DogWalkVM
var selectedIndex:Int
var body: some View {
let currentDog = dogWalksVM.dogs[selectedIndex]
return List {
if currentDog.walks == nil {
EmptyView()
} else {
ForEach(0..<currentDog.walks!.count) { index in
Text("Date \(self.walkDate(currentDog.walks![index] as! Walk))")
}
}
}
.navigationBarTitle(Text("Walks for \(dogWalksVM.dogs[selectedIndex].name ?? "")"), displayMode: .inline)
.navigationBarItems(trailing: Button(action: {
self.addWalk(for: currentDog)
}, label: {
Image(systemName: "plus")
}))
}
func walkDate(_ walk:Walk) -> String{
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
guard let walkDate = walk.date as Date? else { return ""}
return dateFormatter.string(from: walkDate)
}
func addWalk(for currentDog:Dog) {
self.dogWalksVM.addWalk(for: currentDog)
}
}
但是当我添加一个新的应用程序时,应用程序崩溃并出现以下错误:
ForEach<Range<Int>, Int, Text> count (1) != its initial count (0).
`ForEach(_:content:)` should only be used for *constant* data.
Instead conform data to `Identifiable` or use `ForEach(_:id:content:)` and provide an explicit `id`!
如果我尝试在这样的步行中进行 ForEach:
ForEach(Array(currentDog.walks!),id: \.self) { walk in
Text("Date \(self.walkDate(walk))")
}
有人告诉我
Protocol type 'NSOrderedSet.Element' (aka 'Any') cannot conform to 'Hashable' because only concrete types can conform to protocols
解决方案
如本响应中所述,有更好的方法来迭代 NSOrderedSet。Array(my_nsorderedset.set) 不会保留顺序!
相反,使用 mynsorderedset.array 作为![包含类型]。
推荐阅读
- c# - 如何通过 HTTP 触发器将数据加载/保存到 CosmosDB?
- angular - 为特定应用程序或库创建块时,webpack 如何了解工作区中的项目特定依赖关系
- database - NoSQL 数据库中的 JSON 差异版本控制
- powershell - 方法调用失败,因为 [System.String] 不包含名为“SelectNodes”的方法
- python - 使用烧瓶一次提交写入三个数据库
- php - 使用加载数据本地 infile 加载不完整的 csv 数据
- vba - VBA,使用标题名称将值从一张表复制到另一张表
- go - 所有测试的 Golang 全局设置(在相同和其他子模块中)。
- sql-server - SISS - 检查 Null DerivedColumn
- sql - 使用嵌套的 IFNULL 沿互斥路径检查表?