如何修复错误:无法推断通用参数“ T”

时间:2019-01-16 15:35:02

标签: ios swift generics

我正在做一个教程,但遇到一个错误问题:

  

无法推断出通用参数'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

编译器抱怨。

为什么显示此错误,以及如何解决?预先感谢。   
==>在喜欢您的建议之后,现在我可以取得成功。 我的问题解决了。我仍然执行一些操作,如果还有其他问题,我将再次更新。非常感谢!

2 个答案:

答案 0 :(得分:0)

您应该让dequeReusableCell的一般约束为:<T: UICollectionViewCell>而不是<T: UICollectionView>

func dequeReusableCell<T: UICollectionViewCell>(forIndexPath indexPath: IndexPath) -> T where T: ReusableView{

很明显,我会假设TacoCellReusableView的类型。

答案 1 :(得分:0)

  1. 修正错字

        @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()
        }
    
  2. 注释类型并删除强制类型转换

    func dequeueReusableCell<T: UICollectionViewCell>( ...