Как исправить ошибку: общий параметр 'T' не может быть выведен - PullRequest
0 голосов
/ 16 января 2019

Я занимаюсь обучением, и у меня есть одна проблема с ошибкой:

Общий параметр '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 голосов
/ 16 января 2019
  1. Исправить опечатку (и)

    func dequeueReusableCell<T: UICollectionViewCell>( ...
    
  2. Аннотируйте тип и удаляйте приведение типа

    let cell : TacoCell = collectionView.dequeueReusableCell(forIndexPath: indexPath)
    
0 голосов
/ 16 января 2019

Вам следует разрешить общее ограничение для dequeReusableCell: <T: UICollectionViewCell> вместо <T: UICollectionView>:

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

Очевидно, я бы предположил, что TacoCell это тип ReusableView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...