swift - 如何使用功能性 reactiveSwift 从属性中概括表单输入?

标签 swift functional-programming reactive-programming reactive-swift

当我用我想发送的字段做表单时,如果有我经常做的更改

let initialOrChangedName = Signal.merge(
   nameChanged.signal, 
   self.viewDidLoadProperty.signal
       .map { _ in nil }  
   )

在哪里

private let nameChangedProperty = MutableProperty<String?>(nil)
private let viewDidLoadProperty = MutableProperty(())

获取在加载时触发一次的信号,因此当用户点击一个按钮时,我可以在 combineLatest 中使用它,该按钮将向服务器触发带有表单值的 Web 请求。由于这个信号合并,它将给出所有在初始值之后变化的值,允许我在用户点击提交按钮时发送最新值

这个的用法通常是这样的

Signal.combineLatest(intialOrChangedName, initialOrChangedAge)
.sample(on:sendButtonTappedProperty.signal)

如果值发送为零,我只是不将它们包含在网络请求中,但如果用户更改了其中一些值,我会得到其他值。

因为这是一个相当常见的模式,我想将它概括为一个函数,例如

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})
     }
}

这在纸面上看起来不错,但会返回字符串??对于给出的示例,不起作用。

我也曾尝试将它写成 Signal 上的静态函数,但没有成功。

最佳答案

我猜应该是这样的:

extension MutableProperty where Value: OptionalProtocol {


         public func initialOrChangedState(on viewDidLoadProperty: MutableProperty<Void>) -> Signal<Value?, Error> {

              return self.signal.map({Optional<Value>($0)}).merge(with: viewDidLoadProperty.signal.map({_ in nil}))
         }
    }

但是,使用 viewDidLoadProperty 有什么意义呢?实际上,如果您在 viewDidLoad() 结束时订阅您的信号,您甚至不需要这样的属性,因此您不需要 merge() 东西,您也不需要扩展 MutableProperty 协议(protocol)。

所以,您需要做的就是:

submitButton.reactive.controlEvents(.touchUpInside).observer(on: UIScheduler()).observeValues({ _ in
   readInputs()
   launchRequest()
})

关于swift - 如何使用功能性 reactiveSwift 从属性中概括表单输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52294668/

相关文章:

ios - UIButton 框架不随图像调整大小

swift - 保护子句中的逗号是什么意思?

斯卡拉;你能把多个参数定义为一个吗

language-agnostic - "lazy evaluation"和 "reactive programming"

Java - 响应式(Reactive)编程与事件监听器

swift - iTunes 连接 : App uploaded for test build but now showing anymore

swift - 以未经身份验证的用户身份下载 JSON 文件 AWS/S3/Cognito

functional-programming - 自底向上 Hindley-Milner 类型推断 : Applying a substitution to an implicit constraint

functional-programming - 用于标准 ML 的类似 Haskell 的库

javascript - 在 RxJS 中排序数组