2017-10-02 12 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. 그리고 'dispatch'값이 무엇인지 확인했기 때문에 이상합니다. (for: Selector, dispatch: (PublishSubject< S, NoError>, A, B) -> R).

저는 파견을 위해 많은 변수를 사용하려고 시도했지만 아무 것도 얻지 못했습니다. 그것은 나에게 Xcode는 PublishSubject 인수 뒤에 시작하는 변수를 인식하지 못하는 것 같습니다.

내가 뭘 잘못하고 있는지 알고 싶습니다. 혹시 ReactiveKit/본드의 이전 버전에서 마이그레이션 한 경우

답변

1

여기, 구문을 구현하여 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) 
    } 
}