Fil*_*ren 6 ios reactive-cocoa swift
我想要一个两个类的扩展UITextField,UITextView并且代码是相同的,但是我很难想出一个适用于它们的扩展.
我正在使用ReactiveCocoa,我现在有这个
import UIKit
import ReactiveCocoa
import enum Result.NoError
typealias NoError = Result.NoError
// How to DRY up this code?
extension UITextField {
func textSignalProducer() -> SignalProducer<String, NoError> {
return self.rac_textSignal()
.toSignalProducer()
.map { $0 as! String }
.flatMapError { error in SignalProducer<String, NoError>(value: "") }
}
}
extension UITextView {
func textSignalProducer() -> SignalProducer<String, NoError> {
return self.rac_textSignal()
.toSignalProducer()
.map { $0 as! String }
.flatMapError { error in SignalProducer<String, NoError>(value: "") }
}
}
Run Code Online (Sandbox Code Playgroud)
我如何编写一个适合两者的扩展?我试图做类似的事情
protocol TextSignalProducer {}
extension TextSignalProducer where Self: ???? {
// Same code as is duplicated in both current extensions...
}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何指定Self的任一 UITextField或UITextView.类似的东西where Self == UITextField || Self == UITextView可能会使这成为可能.
有没有一种很好的方法来实现我想要尝试的东西?这是否真的有必要(我不知道协议/扩展的命名约定)
import UIKit
import ReactiveCocoa
import enum Result.NoError
typealias NoError = Result.NoError
protocol TextSignal {
func rac_textSignal() -> RACSignal!
}
extension UITextField: TextSignal, TextSignalProducer {}
extension UITextView: TextSignal, TextSignalProducer {}
protocol TextSignalProducer {}
extension TextSignalProducer where Self: TextSignal {
func textSignalProducer() -> SignalProducer<String, NoError> {
return self.rac_textSignal()
.toSignalProducer()
.map { $0 as! String }
.flatMapError { error in SignalProducer<String, NoError>(value: "") }
}
}
Run Code Online (Sandbox Code Playgroud)
我使用的是Swift 2.1,Xcode 7.2和ReactiveCocoa 4.0.1
UITextView并UITextField符合UITextInput协议。如果rac_textSignal基于这个协议(我不确定,因为我手头没有任何带有 RactiveCocoa 的项目:)),你可以这样做:
protocol Cos {
func textSignalProducer() -> String
}
extension UITextView: Cos {
}
extension UITextField: Cos {
}
extension Cos where Self: UITextInput {
func textSignalProducer() -> String {
return "dsfsdf"
}
}
let cos = UITextView()
cos.textSignalProducer()
let cos2 = UITextField()
cos2.textSignalProducer()
Run Code Online (Sandbox Code Playgroud)