2017-10-02 10 views
0

人!私はSwift 2からSwift 4に移行しようとしています。プロジェクトはBondとReactiveKitフレームワークを使用しています。 UISearchBarの拡張機能があります。だから私はこのからの移行問題に直面している:汎用パラメータ 'A'を推測できませんでした(Swift 4、Bond、ReactiveKitフレームワークはSwift 2から移行しました)

import UIKit 
import Bond 
import ReactiveKit 

public extension UISearchBar { 
    public var bnd_delegate: ProtocolProxy { 
     return protocolProxy(for: UISearchBarDelegate.self, setter: NSSelectorFromString("setDelegate:")) 
    } 
} 

public extension UISearchBar { 

    public var bnd_text: DynamicSubject<UISearchBar, String?> { 
     let dispatcher: (PublishSubject<Void, NoError>, UISearchBar, String) -> Void = { _ in } 
     let selector = #selector(UISearchBarDelegate.searchBar(_:textDidChange:)) 

    return DynamicSubject(
     target: self, 
     signal: bnd_delegate.signal(for: selector, dispatch: dispatcher), 
     get: { $0.text }, 
     set: { $0.text = $1 } 
     ) 
    } 
} 

私はすでにいくつかの変更を行い、このコードになる:

import UIKit 
import Bond 
import ReactiveKit 

public extension UISearchBar { 
    public var delegate: ProtocolProxy { 
    return protocolProxy(for: UISearchBarDelegate.self, setter: NSSelectorFromString("setDelegate:")) 
} 

public var text: DynamicSubject<String?> { 
    let dispatcher: (PublishSubject<Void, NoError>, UISearchBar, String) -> Void = { _,_,_ in } 
    let selector = #selector(UISearchBarDelegate.searchBar(_:textDidChange:)) 

    return DynamicSubject<String?>(
     target: self, 
     signal: delegate.signal(for: selector, dispatch: dispatcher), 
     get: { $0.text }, 
     set: { $0.text = $1 } 
     ) 
    } 
} 

現在、私はDynamicSubjectとの誤差を持っている: Generic parameter 'A' could not be inferred。そして私の「ディスパッチ」が値として取るものを確認したので、それは奇妙です:(for: Selector, dispatch: (PublishSubject< S, NoError>, A, B) -> R)

私はディスパッチのためにいくつかの変数で試してみましたが、何も得られませんでした。私には、XcodeはPublishSubject引数の後に始まる変数を認識しないようです。

私が間違っていることを知りたい。

答えて

1

あなたはReactiveKit /ボンドの旧バージョンから移行した場合は、ここでは、構文を実装し、あなたのUIKitの反応性拡張のためにそれを行う方法です:

import UIKit 
import Bond 
import ReactiveKit 

extension ReactiveExtensions where Base: UISearchBar { 

    var delegate: ProtocolProxy { 
     return base.protocolProxy(for: UISearchBarDelegate.self, setter: NSSelectorFromString("setDelegate:")) 
    } 

    var text: DynamicSubject<String?> { 

     let selector = #selector(UISearchBarDelegate.searchBar(_:textDidChange:)) 
     let textChanged = delegate.signal(for: selector) { (subj: SafePublishSubject<Void>, _: UISearchBar, _: NSString) in 
      subj.next(()) 
     } 

     return dynamicSubject(
      signal: textChanged, 
      get: { $0.text }, 
      set: { $0.text = $1 } 
     ) 
    } 
} 

extension UISearchBar: BindableProtocol { 

    public func bind(signal: SafeSignal<String?>) -> Disposable { 
     return reactive.text.bind(signal: signal) 
    } 
} 
関連する問題