"缺少参数参数' for'在电话"

时间:2016-09-07 06:07:27

标签: swift3 xcode8-beta6

虽然在swift3中进行编码,但我想使用自定义协议和泛型来重用集合视图单元格。我知道这是重用细胞的标准方法:

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()
}

但每次我尝试这样做:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(forIndexPath: indexPath) as TacoCell
    cell.configureCell(taco: ds.tacoArray[indexPath.row])
    return cell
}

编译器抱怨我有一个"缺少参数的参数' for' in call" ...在这种情况下,参数是" forIndexPath"

... FYI

我有重复使用单元格和加载笔尖的自定义扩展。代码如下:

ReusableView类

import UIKit

protocol ReusableView: class  { }

extension ReusableView where Self: UIView {

    static var reuseIdentifier: String {
        return String.init(describing: self)
    }
}

NibLoadableView类

import UIKit

protocol NibLoadableView: class { }

extension NibLoadableView where Self: UIView {

    static var nibName: String {
        return String.init(describing: self)
    }
}

这是我对UICollectionView

的扩展
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 dequeueReusableCell<T: UICollectionViewCell>(forIndexPath indexPath: NSIndexPath) -> T where T: ReusableView {

    guard let cell = dequeueReusableCell(withReuseIdentifier: T.reuseIdentifier, for: indexPath as IndexPath) as? T else {
        fatalError("Could not dequeue cell with identifier: \(T.reuseIdentifier)")
    }

    return cell
    }
}

extension UICollectionViewCell: ReusableView { }

1 个答案:

答案 0 :(得分:2)

问题是你在Swift 3.0代码旁边有一些Swift 2.2代码,当编译器尝试选择一个方法来调用时,编译器会感到困惑,因为没有完全匹配。

您的cellForItemAt方法会从集合视图中使用dequeueReusableCell()调用您自己的IndexPath扩展方法。但是,您编写的扩展方法希望收到NSIndexPath,这是一个微妙的不同之处。

修改您的扩展方法,问题应该清除:

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