2015-11-08 39 views
1

我使用的是ReactiveCocoa 4.0.4 alpha 1和Swift 2.1。我正在嘗試編寫一個擴展名,用於在UITextField上創建最大文本限制。擴展ReactiveCocoa

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。它告訴我Value of type RACStream has no member throttle。如果我在throttle之後撥打max,它會給出類似的錯誤。

我看了一下RACStream類檢查過濾器。因爲它返回Self!,這是指RACStream,我會假設,當我擴大班級,通過返回RACStream!會導致類似的行爲。爲什麼我的管道的其餘部分不會響應我的擴展功能?

+0

嘗試與'self'過濾器返回:'回報self.filter {////////}' – ProblemSlover

+0

@ProblemSlover沒有區別,仍是同樣的錯誤消息 – Chris

+0

什麼返回塊像 返回'self.filter {(val:Bool) - >()next ///您的代碼}' – ProblemSlover

回答

3

根據source code方法throttlesubscribeNextRACSignal類(它是RACStream一個子類)的成員,但您的擴展方法適用於RACStream類和調用返回類型RACSignal方法rac_textSignal()。因此,爲了消除您的問題中描述的錯誤,您應該爲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 
+0

工作正常!感謝您的幫助 – Chris

+0

@Chris歡迎您。我很高興這對你有幫助:) – ProblemSlover