我正在使用 ReactiveCocoa 4.0.4 alpha 1 和 Swift 2.1。我正在尝试编写一个扩展,在 UITextField
上创建最大文本限制。
extension RACStream {
public func max(textField: UITextField, max: Int) -> RACStream! {
return filter { next in
if let str = next as? String {
let ret = str.characters.count < max
if !ret {
textField.text = str[0..<max-1]
}
return ret
}
return true
}
}
}
self.inputTextField.rac_textSignal()
.max(self.inputTextField, max: 7)
.throttle(0.25)
.subscribeNext { (obj: AnyObject!) -> Void in
let input = Int(obj as! String)
print(input)
}
当我尝试调用 max
时出现错误。它告诉我 RACStream 类型的值没有成员 throttle
。如果我在 throttle
之后调用 max
,它会给出类似的错误。
我查看了 RACStream
类检查过滤器。由于它返回 Self!
,它指的是 RACStream
,我假设当我扩展类时,通过返回 RACStream!
会导致类似的行为。为什么我的管道的其余部分不响应我的扩展功能?
最佳答案
根据 source code方法 throttle
、subscribeNext
是类 RACSignal
的成员(它是 RACStream
的子类),但是您的扩展方法是用于类 RACStream
并且您调用方法 rac_textSignal()
返回类型 RACSignal
。因此,为了消除问题中描述的错误,您应该为 RACSignal
而不是 RACStream
编写扩展。
extension RACSignal {
public func max(textField: UITextField, max: Int) -> RACSignal {
// method filter can be invoked since RACSignal is subclass of RACStream
return filter { next in
if let str = next as? String {
let ret = str.characters.count < max
if !ret {
textField.text = str[0..<max-1]
}
return ret
}
return true
}
} // Func
} // RacSignal Ext
关于swift - 扩展 ReactiveCocoa,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33591173/