UITableView注册Cell时classForCoder()与self的区别及Swift调用OC类疑问
嘿,刚好可以帮你把这两个问题的差异讲清楚,咱们一个个来捋~
问题1:UITableView注册单元格时,
UITableViewCell.classForCoder()与UITableViewCell.self的区别? 首先,这俩在默认场景下运行效果完全一致,但语义和适用场景有本质区别:
UITableViewCell.self:这是Swift中获取类元类型(UITableViewCell.Type)的标准方式,语义非常明确——就是直接指向UITableViewCell这个类本身。在UITableView注册单元格这种常规业务场景下,这是最推荐的写法,可读性拉满,谁看都知道你要注册的是这个类的单元格。UITableViewCell.classForCoder():这是NSObject协议定义的方法,它的核心设计目的是给归档/解档操作提供对应的类。默认情况下,它的实现就是返回类本身,但如果某个子类重写了这个方法(比如有些类在归档时需要替换成另一个类来处理序列化逻辑),它就会返回重写后的替代类。
简单说:在没有自定义重写classForCoder()的情况下,两者注册单元格的效果一样,但从代码规范和可读性来看,优先用UITableViewCell.self,因为classForCoder()带着编码相关的语义,放在注册单元格的场景里有点“文不对题”。
问题2:Swift中获取OC类的两种写法差异?
你提到的这两种写法,本质就是Swift与OC交互时获取类的两种路径,差异和上面的问题是统一的:
UITableViewCell.self:这是Swift调用OC类时获取类类型的标准写法,直接、清晰,不管是注册单元格还是其他需要类类型的场景,都是首选。UITableViewCell.classForCoder():通过OC的NSObject协议方法间接获取类,默认返回自身,但如果目标类(或它的父类)重写了classForCoder(),结果就会不一样。比如某些OC框架里的类会重写这个方法来实现特殊的归档逻辑,这时候调用它就会得到预期之外的类。
看你给出的两段代码,因为UITableViewCell本身没有重写classForCoder(),所以运行起来完全等价,但从代码的可维护性和语义清晰度来说,还是用UITableViewCell.self更合适。
内容的提问来源于stack exchange,提问作者Vine
相关产品推荐
相关产品推荐

