我想要两个类 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: "") }
}
}
我将如何编写适用于两者的扩展?我正在尝试做类似的事情
protocol TextSignalProducer {}
extension TextSignalProducer where Self: ???? {
// Same code as is duplicated in both current extensions...
}
但我不知道如何将 Self
指定为 UITextField
或 UITextView
。类似于 where Self == UITextField || Self == UITextView
可能会使这成为可能。
有什么好的方法可以完成我想尝试的事情吗?这真的有必要吗(我不知道协议(protocol)/扩展的命名约定)
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: "") }
}
}
我正在使用 Swift 2.1、Xcode 7.2 和 ReactiveCocoa 4.0.1
最佳答案
您可以将建议的解决方案缩减为单个虚拟协议(protocol):
protocol TextSignalProducer {
func rac_textSignal() -> RACSignal!
}
extension TextSignalProducer {
func textSignalProducer() -> SignalProducer<String, NoError> {
return self.rac_textSignal()
.toSignalProducer()
.map { $0 as! String }
.flatMapError { error in SignalProducer<String, NoError>(value: "") }
}
}
extension UITextField: TextSignalProducer {}
extension UITextView: TextSignalProducer {}
不过,我认为没有比这更简洁的方法了。 UITextField
和 UITextView
的 rac_textSignal()
实现没有任何共同点。
关于ios - Swift 扩展子句 where this or that,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35420043/