ios - Swift 扩展子句 where this or that

标签 ios swift reactive-cocoa

我想要两个类 UITextFieldUITextView 的扩展,代码是相同的,但我很难想出一个对它们都适用的扩展。

我正在使用 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 指定为 UITextFieldUITextView。类似于 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 {}

不过,我认为没有比这更简洁的方法了。 UITextFieldUITextViewrac_textSignal() 实现没有任何共同点。

关于ios - Swift 扩展子句 where this or that,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35420043/

相关文章:

swift - 扩展 ReactiveCocoa

ios - 如何从 Swift View 模型绑定(bind)到 Obj-c View Controller ?

ios - 已达到免费开发配置文件的最大应用数量。 Xcode 11.5

ios - 使用按钮 swift 3 触摸位置

ios - Xamarin iOS 设计器 : There was a error rendering this document

swift - 在范围内找不到类型 'View'

ios - 关于方向更改的自定义 UITableViewCell 自动布局问题

javascript - 从 swift 3 调用 javascript 函数

swift - xcode 8 输入字段操作不显示事件下拉列表

ios - ReactiveCocoa : Correct use of signals for checking entity availability