Swiftui 从ObservieObject中删除对象

Swiftui 从ObservieObject中删除对象,swiftui,combine,observableobject,Swiftui,Combine,Observableobject,两个视图模型,一个是包含技能的角色的存储: final class RolesStore: ObservableObject { @Published var roles: [Role] = [] ..... final class SkillStore: ObservableObject { @Published var skills: [Skill] = [] ..... 榜样是: struct Role: Codable, Identifiable { let id

两个
视图模型
,一个是包含
技能的
角色的存储:

final class RolesStore: ObservableObject {
  @Published var roles: [Role] = []
.....
final class SkillStore: ObservableObject {
    @Published var skills: [Skill] = []
.....
榜样是:

struct Role: Codable, Identifiable {
    let id: String
    var name: String
    var skills: [Skill]
}
另一个
ViewModel
技能库

final class RolesStore: ObservableObject {
  @Published var roles: [Role] = []
.....
final class SkillStore: ObservableObject {
    @Published var skills: [Skill] = []
.....
下面显示了我想做的事情,从
SkillStore
(handy)中删除一项技能,并将删除的技能自动从任何
角色中删除,该角色恰好在
角色存储中拥有该技能

import SwiftUI
import PlaygroundSupport

var skillStore = SkillStore(skills: MySkills.skills())
var roleStore = RoleStore(roles: MyRoles.roles(), skillStore: skillStore)

struct ModelsView: View {
    @ObservedObject var skillStore: SkillStore
    @ObservedObject var roleStore: RoleStore
....

如您所见,删除技能
handy
不会将其从角色
Ansatt
中删除。 我不知道如何做到这一点,所以我准备了一个任何人都可以从Github克隆的Xcode游乐场:


必须有一种方法让
SkillStore
依赖于
SkillStore
中的技能,或者除了循环所有角色并从所有具有此技能的角色中删除技能之外,没有其他方法了吗?

我找到了一个解决方案,当我想起一个类可以通过
Combine
的魔力订阅另一个类中的更改时。因此,如果我可以让
RoleStore
类订阅
SkillStore
中的更改,那么
RoleStore
可以在用户删除技能时更新并删除其角色中的技能

为此,
RolesStore
需要引用
SkillStore

import SwiftUI
import PlaygroundSupport

var skillStore = SkillStore(skills: MySkills.skills())
var roleStore = RoleStore(roles: MyRoles.roles(), skillStore: skillStore)

struct ModelsView: View {
    @ObservedObject var skillStore: SkillStore
    @ObservedObject var roleStore: RoleStore
....
SkillStore
使用将发送删除的技能的
PassthroughSubject
更新(
deletedPublisher
):

我已经用这些变化更新了操场