Oyente de teclado en SwiftUI: entrega de claves 1 por 1

Me gustaría interceptar los eventos de entrada del teclado a TextFieldmedida que entran, es decir, cuando el usuario escribe "Café", quiero que active 6 eventos:

  1. C
  2. El
  3. F
  4. F
  5. mi
  6. mi

¿Hay alguna manera de hacer esto en SwiftUI ?

Probé el onChangemodificador de la TextFieldsiguiente manera:

TextField("key", text: $string)
    .onChange(of: string) { newValue in
        print("\(newValue)")
    }

pero a veces solo se activa después de presionar varias teclas cuando escribo muy rápido, por ejemplo, podría obtener estas actualizaciones:

  1. C
  2. Café 💥
  3. café
  4. Café

¿Hay alguna manera de que las claves escritas se entreguen como un flujo de entrada con 1 clave a la vez?

Answer

puede usar lo siguiente para entregar 1 clave a la vez:

    TextField("key", text: $string)
        .onReceive(string.publisher.last()) { val in
            print("val: \(val)")
        }

EDITAR

".... ¿hay alguna forma de registrar una pulsación de la tecla de retroceso?...", intente con la siguiente extensión simple:

struct ContentView: View {
    
    @State var string = ""
    @State var prevString = ""
    
    var body: some View {
        TextField("key", text: $string).border(.red)
            .onReceive(string.publisher.last()) { val in
                if string.count < prevString.count {
                    print("backspace pressed, do something clever here")
                } else {
                    print("val: \(val)")
                }
                prevString = string
            }
    }
    }