在 Swift 中为 @Binding var 设置 didSet

Bag*_*yer 21 swift swiftui combine

通常我们可以didSet在 swift中使用来监视变量的更新。但它不适用于@Binding变量。例如,我有以下代码:

@Binding var text {
   didSet {
       ......
   }
}
Run Code Online (Sandbox Code Playgroud)

但是didSet从来没有被调用过。知道吗?谢谢。

rob*_*off 12

您不应该didSet@Binding.

如果你想要 a 是didSet因为你想在text更改时计算其他东西以显示,只需计算它。例如,如果要显示 中的字符数text

struct ContentView: View {
    @Binding var text: String

    var count: Int { text.count }

    var body: some View {
        VStack {
            Text(text)
            Text(“count: \(count)”)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想观察text是因为你想对你的数据模型做一些其他的改变,那么观察你的变化View是错误的。您应该观察模型中其他地方或控制器对象中的变化,而不是从您的View. 请记住,您View类型,而不是引用类型。SwiftUI 在需要时创建它,并且可能存储它的多个副本,或者根本没有副本。


paw*_*222 6

didSet您可以始终使用onReceive(iOS 13+) 或onChange(iOS 14+)代替:

import Combine
import SwiftUI

struct ContentView: View {
    @State private var counter = 1
    
    var body: some View {
        ChildView(counter: $counter)
        Button("Increment") {
            counter += 1
        }
    }
}

struct ChildView: View {
    @Binding var counter: Int
    
    var body: some View {
        Text(String(counter))
            .onReceive(Just(counter)) { value in
                print("onReceive: \(value)")
            }
            .onChange(of: counter) { value in
                print("onChange: \(value)")
            }
    }
}
Run Code Online (Sandbox Code Playgroud)