SwiftUI/Combine 发布商是双向的吗?

SwiftUI/Combine Are publishers bi-directional?

这段代码的执行让我很困惑:

class RecipeListViewModel: ObservableObject {
    
    @Published var recipeList = [RecipeViewModel]()
    
    init(){

        RecipeRepository.$allRecipeVMs.map { recipes in
            recipes.map { recipe in
            recipe
            }
        }
        .assign(to: &$recipeList)
    }
}

我的理解是 SwiftUI 发布者是单向的,这意味着当 RecipeRepository.allRecipeVMs 被修改时 recipeList 也是如此。但是,我看到的行为是 recipeList 更新时,RecipeRepository.allRecipeVMs 也会更新。我试图找到关于此的文档,但似乎找不到任何东西。

这里是RecipeViewModelclass,不知道有没有用:

class RecipeViewModel : Identifiable, ObservableObject, Hashable{
    
    var id = UUID().uuidString
    @Published var recipe: Recipe

    init(recipe: Recipe){

        self.recipe = recipe
    }
}

不清楚您所说的“修改”是什么。 @Published 和 SwiftUI 视图差异值类型,而您已经创建了一个引用类型数组。它只会在该对象的实例发生变化时发生差异,而不是在对象本身触发其 ObjectWillChange 发布者时发生差异。

坦率地说,这是一个非常有用的设置,因为您可以使用容器来分发和管理应用程序中的依赖项,而不会导致根视图层次结构不断变化和重建。

如果您想要某种双向委托关系,只需将 VM 中的弱变量设置为 self。