В последнее время я играл с фреймворком Combine, и мне было интересно, можно ли создать какое-нибудь умное расширение для изменения текста в качестве издателя.
Допустим, у меня есть два поля UITextFields:
firstTextField.textPub.sink {
self.viewModel.first = $0
}
secondTextField.textPub.sink {
self.viewModel.second = $0
}
где первая и вторая переменные просто `@Published var first / second: String =" "
extension UITextField {
var textPub: AnyPublisher<String, Never> {
return NotificationCenter.default
.publisher(for: UITextField.textDidChangeNotification)
.map {
guard let textField = $0.object as? UITextField else { return "" }
return textField.text ?? ""
}
.eraseToAnyPublisher()
}
}
Это не работает, потому что я использую общий экземпляр NotificationCenter, поэтому, когда я делаю какие-либоизмените любое из textFields, оно распространит новое значение на оба sink
замыкания.Как вы думаете, есть ли способ достичь чего-то похожего на rx.text
, доступного в RxSwift?Я думал об использовании addTarget
с замыканием, но это потребовало бы использования связанных объектов из Objective-C.