swift - 通用函数参数给出 "Expression type is ambiguous without more context"

标签 swift mvvm rx-swift

我有一个函数,它接受两个与 RxSwift 相关的参数并双向绑定(bind)它们。

import Foundation
import RxSwift
import RxCocoa
func bibind<T>(property: ControlProperty<T>, variable: Variable<T>) -> Disposable {

    var updating = false

    let bindToUIDisposable = variable.asObservable().filter({ _ in
        updating = !updating
        return updating
    }).bind(to: property)
    let bindToVariable = property.filter({ _ in
        updating = !updating
        return updating
    }).subscribe(onNext: { n in
        variable.value = n
    }, onCompleted:  {
        bindToUIDisposable.dispose()
    })

    return CompositeDisposable(bindToUIDisposable, bindToVariable)
}

我试着这样调用它

bibind(property: self.userNameTextField.rx.text, variable: self.loginViewModel.userName.value )

显示编译错误

Expression type 'Variable<String>' is ambiguous without more context

View 模型是这样的

import Foundation
import RxSwift
import RxCocoa

class LoginViewModel {
    var userName = Variable<String>("")
    var password = Variable<String>("")

    init() {
        userName = Variable("")
        password = Variable("")
    }
}

最佳答案

类型不匹配。 userNameTextField.rx.text返回 Observable<String?>你的变量是 Observable<String> .您可以使用 orEmpty 解决此问题如 userNameTextField.rx.text.orEmpty .

通常,当您看到此错误时,表示类型不匹配,您需要通过更改其中一个对象的类型来修复它。

关于swift - 通用函数参数给出 "Expression type is ambiguous without more context",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53564878/

相关文章:

ios - ios - 如何在ios swift中使用自动布局以编程方式将两个标签并排放置在中心和间距?

ios - 使用通用 URL 方案向 Google 导航添加多个站点

c# - 如何在WPF DataGrid中选择DataGrid header 中的列的所有复选框

ios - 我们如何通过 distinctuntilChange 只允许 2 个不同的项目来过滤 Observable

ios - RxCocoa 数据绑定(bind)导致 Collection View 滚动到顶部

ios - 在 RxCocoa/RxSwift 中,如何观察 BehaviorRelay<[object]> 数组大小的变化

ios - Swift 发布请求 - JSON 正文为空

swift - 学习 swift : expressions are not allowed at the top level

c# - 获取 View 模型中的选定选项卡(wpf)

c# - 使用 mvvm 设计模式聚焦 wpf datagrid 单元