【问题标题】:Putting a function into a tuple produces a "cannot convert value of type" error将函数放入元组会产生“无法转换类型值”错误
【发布时间】:2016-12-02 20:59:27
【问题描述】:

我正在使用一个集合视图,并且我正在尝试创建一个元组数组,其中包含重用标识符、单元格的类型以及在tableView(_:cellForItemAt:) 中设置单元格时要调用的函数。

到目前为止一切都很好,除了功能。 Xcode 在数组的声明中抱怨它

“无法将类型 '(AddASpotInfoVC) -> (UICollectionViewCell) -> UICollectionViewCell' 的值转换为预期的元素类型 '(UICollectionViewCell) -> UICollectionViewCell'

AddASpotInfoVC 是视图控制器的类。这是数组的初始化本身:

typealias cellFunc = (_ aCell: UICollectionViewCell) -> UICollectionViewCell
let reuseIdentifiers: [(String, UICollectionViewCell.Type, cellFunc)] = [
    ("AddASpotInfoPicCell", AddASpotInfoPicCell.self, picCellFunc),
    ("AddASpotInfoNameCell", AddASpotInfoNameCell.self, nameCellFunc),
    ("AddASpotInfoDescCell", AddASpotInfoDescCell.self, descCellFunc),
    ("AddASpotInfoTagsCell", AddASpotInfoTagsCell.self, tagCellFunc)]

并且数组中的所有函数(目前)都在视图控制器类的扩展中(我认为它不应该是相关的......)并且看起来像这样

func picCellFunc(aCell: UICollectionViewCell) -> UICollectionViewCell {
    return aCell
}

那么,我在数组初始化时做错了什么?

【问题讨论】:

  • 尝试删除除一个以外的所有数组元素,然后将它们一一添加回来,看看是部分还是全部有问题。
  • AddASpotInfoPicCell.Type 不等于 UICollectionViewCell.Type。它是一种不同的类型。
  • 问题是不能在reuseIdentifiers变量的初始化中使用实例方法。您可以将初始化移动到方法(例如 viewDidLoad)或使其成为惰性属性。比较 stackoverflow.com/questions/25855137/…stackoverflow.com/questions/25854300/…stackoverflow.com/questions/39867568/… 是否存在类似(不相同)的问题。
  • @shallowThought : AddASpotInfoPicCell 是 UICollectionViewCell 的子类,声明为class AddASpotInfoPicCell: UICollectionViewCell { },所以很好
  • @JimMatthews 是的,逐步构建数组的元组,当我添加函数时,一切都变得混乱了^^但是谢谢! :-)

标签: arrays swift compiler-errors swift3


【解决方案1】:

函数实现可以依赖于其他变量。所以它要求你将函数声明为静态的。使用:

static func picCellFunc (aCell: UICollectionViewCell) -> UICollectionViewCell

在你的数组中使用:

AddASpotInfoVC.picCellFunc

编辑:您还可以将数组初始化代码移动到您的函数或初始化程序之一中。

【讨论】:

  • 这简直太完美了。非常感谢!
【解决方案2】:

如果您的函数没有使用任何状态,那么像 Adamsor 建议的那样将它们设为类或静态方法确实有意义。

但是,如果您确实希望您的方法读取/写入 viewController 实例中的任何变量,您可以对元组数组使用惰性 var,并使用 self 引用方法,如下所示:

lazy var reuseIdentifiers: [(String, UICollectionViewCell.Type, cellFunc)] = [
    ("AddASpotInfoPicCell", AddASpotInfoPicCell.self, self.picCellFunc),
    ("AddASpotInfoNameCell", AddASpotInfoNameCell.self, self.nameCellFunc),
    ("AddASpotInfoDescCell", AddASpotInfoDescCell.self, self.descCellFunc),
    ("AddASpotInfoTagsCell", AddASpotInfoTagsCell.self, self.tagCellFunc)]

【讨论】:

  • 没想到。但是在延迟加载的时候,CollectionViewDataSource方法调用数组时不能初始化吗?
  • 很高兴知道!不过,对于未来的读者来说,有一件事似乎 Swift(至少 Swift3)不允许懒惰。必须是 var。
猜你喜欢
  • 2017-09-20
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 2014-10-06
  • 2015-10-31
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
相关资源
最近更新 更多