Closed4

SwiftUI: .onChangeで変更前の値を取る

kabeyakabeya

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]は、どういう言語要素なのでしょうか。

kabeyakabeya

キャプチャリストの説明を見ると[]の中にはキャプチャした値を入れる変数を定義できるようなので、以下のような書き方が、紛らわしくなくて良さそうです。

.onChange(of: value) { [oldValue = self.value] newValue in
   print("oldValue: \(oldValue), newValue: \(newValue)")
}
kabeyakabeya

iOS17では、新旧2個の引数を取るクロージャが標準になって、新だけ1個のクロージャはdeprecatedになりました。

.onChange(of: value) { oldValue, newValue in
   print("oldValue: \(oldValue), newValue: \(newValue)")
}

が新標準なんですね。

このスクラップは2023/10/19にクローズされました