You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何UICollectionViewController子类实现协议方法需加override关键字?

问题解答

你遇到的这个看似矛盾的情况,其实和UICollectionViewController的底层实现背景有关:

  • 虽然Swift公开的接口定义里,UICollectionViewController没有显式写出UICollectionViewDataSource协议的必填方法,但它的Objective-C底层实现已经为这些方法提供了默认的空实现。比如在Objective-C源码中,会有类似这样的默认逻辑:
    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
        return 0;
    }
    
  • 当Swift类继承自Objective-C编写的父类时,Swift会识别到这些底层存在的方法实现。按照Swift的语法规则,如果你要重写父类已有的方法(哪怕这个方法是来自父类对协议的隐式实现),就必须加上override关键字,以此明确你是在覆盖父类的逻辑,而不是定义一个新的同名方法。
  • 从功能层面来说,UICollectionViewController作为专门管理UICollectionView的控制器,必须保证collectionView能正常初始化运行——如果没有这些默认的数据源方法实现,collectionView会因缺少必要的数据源回调而直接崩溃,这也是它必须隐含实现这些方法的核心原因。

你代码里的override func collectionView(_:numberOfItemsInSection:)方法,本质就是在重写父类那个默认返回0的实现,改成根据messages数组的长度返回正确的item数量,这完全符合Swift的语法规范。

内容的提问来源于stack exchange,提问作者Ninja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:14:47