【问题标题】:Generic parameter 'A' could not be inferred (Swift 4, Bond and ReactiveKit frameworks migrating from Swift 2)无法推断通用参数“A”(Swift 4、Bond 和 ReactiveKit 框架从 Swift 2 迁移)
【发布时间】:2018-03-13 20:48:55
【问题描述】:

伙计们!我正在尝试从 Swift 2 迁移到 Swift 4。项目正在使用 Bond 和 ReactiveKit 框架。我有 UISearchBar 的扩展名。所以我面临着从这个迁移的问题:

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 参数之后开始的任何变量。

我想知道我做错了什么。

【问题讨论】:

    标签: swift migration swift4 reactivekit swiftbond


    【解决方案1】:

    如果您曾经从旧版本的 ReactiveKit/Bond 实现的语法迁移,这里是如何为您的 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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多