首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSOrderedSet和SwiftUI ForEach

NSOrderedSet和SwiftUI ForEach
EN

Stack Overflow用户
提问于 2019-11-08 10:04:05
回答 2查看 2.2K关注 0票数 2

我正在尝试使用CoreData和SwiftUI,并且有两个实体:狗和行走。Dog之间是一对多关系

代码语言:javascript
复制
public class Dog: NSManagedObject, Identifiable {
  @NSManaged public var name: String?
  @NSManaged public var walks: NSOrderedSet?
}

和漫步

代码语言:javascript
复制
public class Walk: NSManagedObject, Identifiable {
  @NSManaged public var date: Date?
  @NSManaged public var dog: Dog? 
}

我遇到的问题是在列表中显示选定狗的所有散步。以下WalksView将显示所有当前漫游

代码语言:javascript
复制
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)

}
}

但当我添加一个新的应用程序时,应用程序崩溃,并显示以下错误:

代码语言:javascript
复制
 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,如下所示:

代码语言:javascript
复制
 ForEach(Array(currentDog.walks!),id: \.self) { walk in
                Text("Date \(self.walkDate(walk))")
            }

有人告诉我

代码语言:javascript
复制
Protocol type 'NSOrderedSet.Element' (aka 'Any') cannot conform to 'Hashable' because only concrete types can conform to protocols
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-08 13:32:00

下面的内容应该会对你有所帮助

代码语言:javascript
复制
 ForEach(Array(currentDog.walks!.set),id: \.self) { walk in
                Text("Date \(self.walkDate(walk))")
            }
票数 3
EN

Stack Overflow用户

发布于 2019-12-01 00:25:58

正如本response中所述,有一种更好的方法可以遍历NSOrderedSet。数组(my_nsorderedset.set)不会保留顺序!

相反,使用mynsorderedset.array as!ContainedType。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58759409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档