Closed4
SwiftUI: .onChangeで変更前の値を取る
SwiftUIで、バインディング変数の変更を感知するには.onChange(of:perform:)
を使うのですが、
.onChange(of: value) { newValue in
print("newValue: \(newValue)")
}
の形式だと、新しい値しか得られませんし、self.value
もすでに新しい値になってしまっています。
ところが、
.onChange(of: value) { [value] newValue in
print("oldValue: \(value), newValue: \(newValue)")
}
だと古い値がvalue
として参照できます。ちなみにself.value
はもう新しい値になっています。
そこまでは色々なところに書いてあるのですが、疑問点は「そもそもこの構文は何なのか」です。
この[value]
は、どういう言語要素なのでしょうか。
キャプチャリスト、ということでした。
キャプチャリストの説明を見ると[]
の中にはキャプチャした値を入れる変数を定義できるようなので、以下のような書き方が、紛らわしくなくて良さそうです。
.onChange(of: value) { [oldValue = self.value] newValue in
print("oldValue: \(oldValue), newValue: \(newValue)")
}
iOS17では、新旧2個の引数を取るクロージャが標準になって、新だけ1個のクロージャはdeprecatedになりました。
.onChange(of: value) { oldValue, newValue in
print("oldValue: \(oldValue), newValue: \(newValue)")
}
が新標準なんですね。
このスクラップは2023/10/19にクローズされました