为何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
相关产品推荐
相关产品推荐

