Swift 3 警告 func collectionView 实例方法几乎符合可选要求

Posted

技术标签:

【中文标题】Swift 3 警告 func collectionView 实例方法几乎符合可选要求【英文标题】:Swift 3 warning func collectionView instance method nearly matches optional requirement 【发布时间】:2016-12-11 15:12:28 【问题描述】:

我正在将我的项目转换为 Xcode 8.1 中的 Swift 3,并且我的集合视图函数之一正在返回一条警告消息,指示足迹已更改。代码是

 func collectionView(_ collectionView: UICollectionView, cellForItemAtIndexPath indexPath: IndexPath) -> UICollectionViewCell 

警告是

实例方法 CollectionView(:CellForItemAtIndexPath:) 几乎匹配协议 UICollectionViewDelegate 的可选要求 collectionView(:canFocusItemAt:)

我相信这里的警告是一个红鲱鱼。我查看了 API 参考 https://developer.apple.com/reference/uikit/uicollectionview/1618088-cellforitem 并看到了

func cellForItem(at indexPath: IndexPath) -> UICollectionViewCell?

但是,我找不到这样的声明,它不会导致带有红点的编译器错误。

编辑:

在下面的答案之后,我将数据源添加到我的 ViewController 类中,如下所示:

class MyController: UIViewController,
                         UICollectionViewDelegateFlowLayout,
                         UICollectionViewDataSource,

然后在ViewDidLoad() 我添加了这个myCollectionView.dataSource = self

我现在有这个

func collectionView(_ collectionView: UICollectionView,
                    cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

这个 View Controller 完全是用代码构建的,并且没有实现数据源,尽管有 numberOfSectionsInCollectionView 的代码在添加数据源后产生了编译器红点。这已更新为

func numberOfSections(in collectionView: UICollectionView) -> Int 

【问题讨论】:

尝试将它们设置为public 【参考方案1】:

我认为这里的警告是一个红鲱鱼

好吧,事实并非如此。通常对待编译器的方式是尊重;它通常比你知道的多得多。您的https://developer.apple.com/reference/uikit/uicollectionview/1618088-cellforitem 是红鲱鱼。

这个就是你想要的功能:

https://developer.apple.com/reference/uikit/uicollectionviewdatasource/1618029-collectionview

如你所见,签名是:

func collectionView(_ collectionView: UICollectionView, 
    cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

...与您最初写的内容略有不同。

要注意的另一件事是,您必须在明确采用 UICollectionViewDataSource 的类声明中进行此声明。唯一的例外是如果这是一个 UICollectionViewController,在这种情况下它已经采用了 UICollectionViewDataSource——在这种情况下,编译器会告诉你在声明中添加override(你应该遵守)。

【讨论】:

以上是关于Swift 3 警告 func collectionView 实例方法几乎符合可选要求的主要内容,如果未能解决你的问题,请参考以下文章

Xcode8/Swift 3 更新后缺少 Firebase 标头警告

升级到 Xcode 8 并将语法从 swift 2.3 转换为 swift 3.0 后文件丢失警告

XCode6 Beta 中的编译器警告 - “速记外部参数名称”

Swift 3:覆盖成为FirstResponder时警告“未使用的调用结果”

Swift 3 获取请求错误(警告:无法加载任何 Objective-C 类信息)

swift 3 present from appdelegate 错误:警告:尝试显示〜其视图不在窗口层次结构中