Skip to content

Instantly share code, notes, and snippets.

@aromal-sasidharan
Created February 9, 2019 17:18
Show Gist options
  • Save aromal-sasidharan/405749fecfa8bbbad30b5c3ae04b88c8 to your computer and use it in GitHub Desktop.
Save aromal-sasidharan/405749fecfa8bbbad30b5c3ae04b88c8 to your computer and use it in GitHub Desktop.
rx swift texfield validation and scanning
extension Reactive where Base: UITextField {
public func validateWithRegex(value:String) -> ControlProperty<String?> {
let original: ControlProperty<String?> = self.text
let values: Observable<String?> = original.map { self.validate(text: $0, regex: value) }
let valueSink: AnyObserver<String?> = original.mapObserver { $0 }
return ControlProperty<String?>(values: values, valueSink: valueSink)
}
public func scanWithRegExp(value:String) -> ControlProperty<String> {
let original: ControlProperty<String> = self.text.orEmpty
let values: Observable<String> = original.scan("", accumulator: self.shouldChangeText(regex: value))
.do(onNext: { self.base.text = $0})
let valueSink: AnyObserver<String> = original.mapObserver { $0 }
return ControlProperty<String>(values: values, valueSink: valueSink)
}
private func shouldChangeText(regex:String) -> ((String,String) -> String){
return { (prev,next) in
if next.count == 0{
return next
}
if (next ~= regex) == false{
return prev
}
return next
}
}
private func validate(text:String?, regex:String) -> String?{
guard let text = text else{
return nil
}
if text.isEmpty == true{
return text
}
return (text ~= regex) ? text : nil
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment