Swift 绑定到计算 属性

Swift binding to a computed property

有以下情况。我有一个视图模型,它是一个具有 Bool 类型计算 属性 的可观察对象。我希望能够 enable/disable 基于计算 属性 的导航 link,但我需要一个绑定才能这样做。这里有一个简化的例子:

struct Project {
    var name: String
    var duration: Int
}

class MyViewModel: Observable Object {
    @Published var project: Project

    var isProjectValid: Bool {
        return project.name != "" && project.duration > 0
    }
}

struct MyView: View {
    @EnvironmentObject var myVM: MyViewModel

    var body: some View {
        ...
        NavigationLink("Click Link", isActive: ?????, destination: NextView())
        ...
    }
}

由于 isActive 需要绑定,因此我无法访问计算 属性,例如 myVM.isProjectValid。还尝试了项目 class 中的计算 属性,仍然是同样的问题。

还考虑过创建与计算相关的自定义绑定 属性,但不太确定 if/how 是否应该这样做。

我发布的第一个问题,所以如果我遗漏了一些细节,请多多包涵:)

将其设为 @Published 属性 并在 project 更改时更新它

class MyViewModel: ObservableObject {
    @Published var project: Project {
        didSet {
            isProjectValid = project.name != "" && project.duration > 0
        }
    }

    @Published var isProjectValid: Bool

     //...
}

计算 属性 的使用建议用户不应直接触发 NavigationLink 的某种设计。但是 NavigationLink 应该作为代码中其他地方的某些其他机制的 side-effect 以编程方式触发。例如可能在用户完成表单或类似过程时完成。

如果这是目标,则不是 100%,但如果是,那么一种选择是将常量绑定传递给 NavigationLink,例如

NavigationLink("Click Link", isActive: .constant(myVM.isProjectValid), destination: NextView())`