没有 'items' 候选人产生预期的上下文结果类型 '(Observable<[Product]>) -> (_) -> _'
No 'items' candidates produce the expected contextual result type '(Observable<[Product]>) -> (_) -> _'
这是我的代码片段:
class ProductCategoryCell: UITableViewCell {
@IBOutlet weak var collectionViewProducts: UICollectionView!
// other stuff...
func setProducts() {
let productsObservable = Observable.just([
Product(name: "test", price: 10.0),
Product(name: "test", price: 10.0),
Product(name: "test", price: 10.0)
])
productsObservable.bindTo(collectionViewProducts.rx.items(cellIdentifier: "ProductCell", cellType: ProductCell.self)) {
(row, element, cell) in
cell.setProduct(element)
}.disposed(by: disposeBag)
}
}
它给我一个构建错误:
No 'items' candidates produce the expected contextual result type '(Observable<[Product]>) -> (_) -> _'
在我的视图控制器中,我使用类似的代码填充 table 视图:
let productsObservable = Observable.just(testProducts)
productsObservable.bindTo(tableViewProducts.rx.items(cellIdentifier: "ProductCategoryCell", cellType: ProductCategoryCell.self)) { (row, element, cell) in
cell.setCategory(category: element)
}.disposed(by: disposeBag)
此代码正常工作。我做错了什么?
我能够重现您收到的错误消息。您没有 post 您的 ProductCell
的 setProduct()
方法的代码,但我想您可能遇到了与我相同的问题。
这是我的虚拟 ProductCell
实现:
class ProductCell: UICollectionViewCell {
func setProduct(product: Product) {
// do stuff
}
}
现在当我在你的答案中使用代码时:
productsObservable.bindTo(collectionViewProducts.rx.items(cellIdentifier: "ProductCell", cellType: ProductCell.self)) { (row, element, cell) in
cell.setProduct(element)
}
.disposed(by: disposeBag)
我得到了和你一样的错误:
No 'items' candidates produce the expected contextual result type
'(Observable<[Product]>) -> (_) -> _'
在我的例子中,问题是我在调用 setProduct:
时忘记了参数标签 product
添加参数标签后,代码编译无误:
productsObservable.bindTo(collectionViewProducts.rx.items(cellIdentifier: "ProductCell", cellType: ProductCell.self)) { (row, element, cell) in
cell.setProduct(product: element)
}
.disposed(by: disposeBag)
在这种情况下,编译器的错误消息非常具有误导性。当您尝试在闭包之外调用 setProduct(element)
时,您会得到正确的错误消息:
Missing argument label 'product:' in call
但不知何故,当他在闭包内部时,编译器并没有意识到问题到底是什么。
正如我之前提到的,我不知道您是如何在 ProductCell
中实现 setProduct
,但是因为您在 UITableView
示例中调用了 cell.setCategory(category: element)
,我假设你的问题是当你调用 cell.setProduct(element)
时缺少参数标签
这是我的代码片段:
class ProductCategoryCell: UITableViewCell {
@IBOutlet weak var collectionViewProducts: UICollectionView!
// other stuff...
func setProducts() {
let productsObservable = Observable.just([
Product(name: "test", price: 10.0),
Product(name: "test", price: 10.0),
Product(name: "test", price: 10.0)
])
productsObservable.bindTo(collectionViewProducts.rx.items(cellIdentifier: "ProductCell", cellType: ProductCell.self)) {
(row, element, cell) in
cell.setProduct(element)
}.disposed(by: disposeBag)
}
}
它给我一个构建错误:
No 'items' candidates produce the expected contextual result type '(Observable<[Product]>) -> (_) -> _'
在我的视图控制器中,我使用类似的代码填充 table 视图:
let productsObservable = Observable.just(testProducts)
productsObservable.bindTo(tableViewProducts.rx.items(cellIdentifier: "ProductCategoryCell", cellType: ProductCategoryCell.self)) { (row, element, cell) in
cell.setCategory(category: element)
}.disposed(by: disposeBag)
此代码正常工作。我做错了什么?
我能够重现您收到的错误消息。您没有 post 您的 ProductCell
的 setProduct()
方法的代码,但我想您可能遇到了与我相同的问题。
这是我的虚拟 ProductCell
实现:
class ProductCell: UICollectionViewCell {
func setProduct(product: Product) {
// do stuff
}
}
现在当我在你的答案中使用代码时:
productsObservable.bindTo(collectionViewProducts.rx.items(cellIdentifier: "ProductCell", cellType: ProductCell.self)) { (row, element, cell) in
cell.setProduct(element)
}
.disposed(by: disposeBag)
我得到了和你一样的错误:
No 'items' candidates produce the expected contextual result type '(Observable<[Product]>) -> (_) -> _'
在我的例子中,问题是我在调用 setProduct:
product
添加参数标签后,代码编译无误:
productsObservable.bindTo(collectionViewProducts.rx.items(cellIdentifier: "ProductCell", cellType: ProductCell.self)) { (row, element, cell) in
cell.setProduct(product: element)
}
.disposed(by: disposeBag)
在这种情况下,编译器的错误消息非常具有误导性。当您尝试在闭包之外调用 setProduct(element)
时,您会得到正确的错误消息:
Missing argument label 'product:' in call
但不知何故,当他在闭包内部时,编译器并没有意识到问题到底是什么。
正如我之前提到的,我不知道您是如何在 ProductCell
中实现 setProduct
,但是因为您在 UITableView
示例中调用了 cell.setCategory(category: element)
,我假设你的问题是当你调用 cell.setProduct(element)