gpt4 book ai didi

ios - RxSwift - 绑定(bind)到 tableView 的可选问题

转载 作者:行者123 更新时间:2023-12-02 22:44:46 25 4
gpt4 key购买 nike

我有一个 UITableView 和一个 users 变量,其签名如下:

let users: Variable<[User]?> = Variable<[User]?>(nil)

当我尝试在 UITableView 中绑定(bind)这个用户数组时,我收到错误无法推断通用参数“Self”。仅当我观察可选类型时才会发生这种情况。为什么会出现这种情况?这种情况的解决方法是什么?

以下是我的做法的示例:

private func bind() {
// Does not compile: Generic parameter 'Self' could not be inferred
users.asObservable().bind(to:
tableView.rx.items(cellIdentifier: "UserCell",
cellType: UITableViewCell.self)) { (index, user, cell) in
// Cell setup.
}.disposed(by: disposeBag)
}

最佳答案

您看到此错误是因为编译器无法推断传递给以下函数的Optional变量users的类型,这些函数适用于泛型并且需要能够推断类型。

Swift 中的Optional 实际上的实现如下所示。我猜想如果 Optional 可能是 nil 又名 .none ,编译器无法推断出方法的类型,例如itemsbind(to:) 适用于泛型。

public enum Optional<Wrapped> : ExpressibleByNilLiteral {

/// The absence of a value.
///
/// In code, the absence of a value is typically written using the `nil`
/// literal rather than the explicit `.none` enumeration case.
case none

/// The presence of a value, stored as `Wrapped`.
case some(Wrapped)

/// Creates an instance that stores the given value.
public init(_ some: Wrapped)
//...
}

解决方法 1.):您可以使用 filterNil() (RxOptionals lib) 来避免该问题。

private func bind() {
users.asObservable().filterNil().bind(to:
tableView.rx.items(cellIdentifier: "UserCell",
cellType: UITableViewCell.self)) { (index, user, cell) in
// Cell setup.
}.disposed(by: disposeBag)
}

解决方法 2.):使 users 成为非可选。如果您没有用户,只需设置一个空数组作为值。

let users: Variable<[User]> = Variable<[User]>([])

解决方法 3.):使用 Nil-Coalescing Operator ??map 函数中,如

private func bind() {
users.asObservable().map { optionalUsers -> [User] in
return optionalUsers ?? []
}
.bind(to:
tableView.rx.items(cellIdentifier: "UserCell",
cellType: UITableViewCell.self)) { (index, user, cell) in
// Cell setup.
}.disposed(by: disposeBag)
}

旁注:最新版本的 RxSwift 中已弃用 Variable

仅供引用:

项目的实现

public func items<S: Sequence, Cell: UITableViewCell, O : ObservableType>
(cellIdentifier: String, cellType: Cell.Type = Cell.self)
-> (_ source: O)
-> (_ configureCell: @escaping (Int, S.Iterator.Element, Cell) -> Void)
-> Disposable
where O.E == S {
return { source in
return { configureCell in
let dataSource = RxTableViewReactiveArrayDataSourceSequenceWrapper<S> { (tv, i, item) in
let indexPath = IndexPath(item: i, section: 0)
let cell = tv.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! Cell
configureCell(i, item, cell)
return cell
}
return self.items(dataSource: dataSource)(source)
}
}
}

实现bind(to:)

public func bind<O: ObserverType>(to observer: O) -> Disposable where O.E == E {
return self.subscribe(observer)
}

关于ios - RxSwift - 绑定(bind)到 tableView 的可选问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49636059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com