Swift扩展子句在哪里或那个

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任一 UITextFieldUITextView.类似的东西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

Tom*_*ikć 0

UITextViewUITextField符合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)