Ios SwiftUI变量:willSet,didSet

Ios SwiftUI变量:willSet,didSet,ios,swift,swiftui,Ios,Swift,Swiftui,我在SwiftUI应用程序中有这样的代码: @Published var myFlag = false { willSet { ... useful code ... objectWillChange.send() } } 它或多或少能起作用,但为了确切地得到我需要的东西,我想要这样的东西: @Published var myFlag = false { didSet { ... useful code ...

我在SwiftUI应用程序中有这样的代码:

@Published var myFlag = false {
    willSet {
        ... useful code ...
        objectWillChange.send()
    }
}
它或多或少能起作用,但为了确切地得到我需要的东西,我想要这样的东西:

@Published var myFlag = false {
    didSet {
        ... useful code ...
        objectDidChange.send()
    }
}
原因很简单,我希望在myFlag更新后收到通知,而不是之前。不过,它似乎不是这样工作的。 有没有别的办法得到我想要的

除此之外,我正在使用以下代码:

.onReceive(self.appState.$myFlag) {...}

内部ContentView.swift

@Published
当属性位于
willSet

如果您希望在
didSet
期间发布,请删除
@Published
并手动发布

import SwiftUI
class ManualOObject: ObservableObject {
    var someValue: Int = 0{
        willSet{
            print("willSet - \(someValue)")
        }
        didSet{
            print("didSet - \(someValue)")
            objectWillChange.send()
        }
    }
    init() {
        for n in 0...5 {
            
            DispatchQueue.main.asyncAfter(deadline: .now() + Double(n)) {
                print("n = \(n.description)")
                            self.someValue = n
                        }
        }
    }
}
struct ManualOOView: View {
    @ObservedObject var manualOObject = ManualOObject()
    
    var body: some View {
        Text(manualOObject.someValue.description).onReceive(manualOObject.objectWillChange, perform: { _ in
            print("UI received = \(manualOObject.someValue)")
        })
    }
}

只要设置@Published属性,就会自动调用
objectDidChange.send()
,因此您的代码至少是多余的(甚至可能是有害的)。你想用这些代码做什么?你能给客户看一下这个可观测的物体吗?或者,更好的,完整的可测试快照?@Asperi;我需要能够做一些辅助处理(即…有用的代码…),就像我在willSet中做的那样。但是我也希望在值更新之后而不是之前发送更新信号。如果我只是从willSet中删除objectWillChange.send()。这行得通吗?我想尝试一下,但如果我删除ContentView.swift中的“@Published”代码,“.onReceive(self.appState.$myFlag)”将不再有效。我得到了这个错误:“表达式类型'(,“@escaping”(.Output)->Void)->some View'在没有更多上下文的情况下是不明确的”我在代码中举例说明了如何使用onReceive。此外,如果您需要完成更具体的工作,请使用MVVM。保持视图远离函数,ViewModel将完成所有工作。