Objective-C转Swift遇setTag与UIView父类setter冲突问题求助
解决Swift转译时
setTag与UIView父类冲突的问题 这个错误的核心原因很明确:你的自定义LPFPickerCell类里的setTag方法,和父类UIView自带的tag属性的setter方法(Objective-C选择器都是setTag:)完全重名了,Swift的类型安全机制不允许这种冲突出现——而Objective-C因为动态特性可能之前没暴露这个问题。
根据你的场景,给你几个针对性的解决方案:
1. 重命名自定义的setTag方法(最直接)
如果你的setTag方法是用来处理和UIView原生tag不同的业务逻辑(比如存储非整数类型的标记,或是另一个业务相关的标识),那最简单的办法就是给它改名:
- 在Objective-C的
.h/.m文件里,把原来的- (void)setTag:(...)tag改成比如- (void)setPickerCellTag:(...)tag(名字可以根据业务自定义,只要不叫setTag:就行) - 转成Swift后,对应的方法就会变成
setPickerCellTag(_:),属性如果有的话就是pickerCellTag,这样就不会和父类的tag冲突了。
2. 重写父类的tag setter(如果是要扩展原生tag功能)
如果你原来的setTag就是想扩展UIView原生tag的逻辑(比如设置tag时同时做一些额外操作),那要确保方法参数和父类一致(原生tag是NSInteger类型),然后在Swift里用override关键字重写:
override var tag: Int { didSet { // 在这里添加你原来setTag方法里的自定义逻辑 // 比如调用DCclass的相关方法,或者更新cell状态 } }
注意:如果原来的OCsetTag参数不是NSInteger,那这个方案不适用,必须用第一个方案改名。
3. 用关联对象存储自定义标记(替代重写setTag)
如果你的需求是给cell附加额外的标记数据,但又不想影响原生tag,可以用Objective-C的关联对象来实现(转Swift后也能兼容):
在OC的LPFPickerCell.m里:
#import <objc/runtime.h> static const void *CustomTagKey = &CustomTagKey; - (void)setCustomTag:(id)tag { objc_setAssociatedObject(self, CustomTagKey, tag, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (id)customTag { return objc_getAssociatedObject(self, CustomTagKey); }
这样你可以通过customTag存储任意类型的数据,完全不会和原生tag冲突,转Swift后直接调用customTag属性即可。
内容的提问来源于stack exchange,提问作者Nirmal
相关产品推荐
相关产品推荐

