При выполнении форм с полями я хочу отправить, если есть изменение, которое я часто делаю
let initialOrChangedName = Signal.merge(
nameChanged.signal,
self.viewDidLoadProperty.signal
.map { _ in nil }
)
, где
private let nameChangedProperty = MutableProperty<String?>(nil)
private let viewDidLoadProperty = MutableProperty(())
, чтобы получить сигнал, который один раз сработал при загрузке,поэтому я могу использовать его в сочетании с последним, когда пользователь нажимает кнопку, которая запускает веб-запрос со значением формы на сервере.Поскольку этот сигнал объединяется, он дает все значения, которые изменяются после исходного значения, что позволяет мне отправлять самое новое значение, когда пользователь нажимает кнопку отправки
. Обычно для этого используется значение, подобное
Signal.combineLatest(intialOrChangedName, initialOrChangedAge)
.sample(on:sendButtonTappedProperty.signal)
* 1011.* если значения отправлены ноль, я просто не включаю их в веб-запрос, но я получаю другие значения, если некоторые из них были изменены пользователем.
Поскольку это довольно распространенный шаблон, я хочу обобщитьэто к одной функции, например
let initialOrChangedName = nameChanged.initialOrChangedState(on: viewDidLoadProperty)
Я пытался написать это
extension MutableProperty where Value: OptionalProtocol {
public func initialOrChangedState(on viewDidLoadProperty: MutableProperty<Void>) -> Signal<Value?, Error> {
return Signal.merge(self.signal.map(Optional.init),
viewDidLoadProperty.signal.map { _ in nil})
}
}
Что хорошо выглядит на бумаге, но вернет String ??для данного примера, и не работает.
Я также пытался написать его как статическую функцию для сигнала, но безуспешно.