我正在做一个教程,但遇到一个错误问题:
无法推断出通用参数'T'。
**** >>我只是按照您的建议更新问题。
并添加了2行代码:
let cell: TacoCell = collectionView.dequeReusableCell(forIndexPath: indexPath) cell.configureCell(taco: ds.tacoArray[indexPath.row]) return cell
我也修改了这段代码:
func dequeReusableCell to dequeReusableCell在我的UICollectionView + Ex.swift文件中。
import UIKit
extension UICollectionView {
func register<T: UICollectionViewCell>(_: T.Type) where T: ReusableView, T: NibLoadableView {
let nib = UINib(nibName: T.nibName, bundle: nil)
register(nib, forCellWithReuseIdentifier: T.reuseIdentifier)
}
func dequeReusableCell<T: UICollectionView>(forIndexPath indexPath: IndexPath) -> T where T: ReusableView{
guard let cell = dequeueReusableCell(withReuseIdentifier: T.reuseIdentifier, for: indexPath as IndexPath) as? T else {
fatalError("Coud not deque cell with Identifier: \(T.reuseIdentifier)")
}
return cell
}
}
extension UICollectionViewCell: ReusableView {}
在我的MainVC.swift中,我有以下代码:
import UIKit
class MainVC: UIViewController, DataServiceDelegate {
@IBOutlet weak var headerView: HeaderView!
@IBOutlet weak var collectionView: UICollectionView!
var ds: DataService = DataService.instance
override func viewDidLoad() {
super.viewDidLoad()
ds.delegate = self
ds.loadDeliciousTacoData()
collectionView.dataSource = self
collectionView.delegate = self
headerView.addDropShadow()
/*
let nib = UINib(nibName: "TacoCell", bundle: nil)
collectionView.register(nib, forCellWithReuseIdentifier: "TacoCell")
*/
collectionView.register(TacoCell.self)
}
func deliciousTacoDataLoaded() {
print("Delicious Taco Data Loaded!")
}
}
extension MainVC: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return ds.tacoArray.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TacoCell", for: indexPath) as? TacoCell {
// cell.configureCell(taco: ds.tacoArray[indexPath.row])
// return cell
// }
// return UICollectionViewCell()
let cell: TacoCell = collectionView.dequeReusableCell(forIndexPath: indexPath)
cell.configureCell(taco: ds.tacoArray[indexPath.row])
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 95, height: 95)
}
}
在这一行:
let cell = collectionView.dequeReusableCell(forIndexPath: indexPath) as TacoCell
编译器抱怨。
为什么显示此错误,以及如何解决?预先感谢。
==>在喜欢您的建议之后,现在我可以取得成功。
我的问题解决了。我仍然执行一些操作,如果还有其他问题,我将再次更新。非常感谢!
答案 0 :(得分:0)
您应该让dequeReusableCell
的一般约束为:<T: UICollectionViewCell>
而不是<T: UICollectionView>
:
func dequeReusableCell<T: UICollectionViewCell>(forIndexPath indexPath: IndexPath) -> T where T: ReusableView{
很明显,我会假设TacoCell
是ReusableView
的类型。
答案 1 :(得分:0)
修正错字
@IBAction func ActionShowActiveUsers(_ sender: Any) {
userDataSource = mainUsers.filter( { return $0.active == true } )
tableView.reloadData()
}
@IBAction func btnShowInActiveUser(_ sender: Any) {
userDataSource = mainUsers.filter( { return $0.active == false } )
tableView.reloadData()
}
注释类型并删除强制类型转换
func dequeueReusableCell<T: UICollectionViewCell>( ...