如何在Swift中创建NSProxy子类?初始化报错问题解析
在Swift中为NSProxy子类添加自定义初始化方法的问题与解决办法
很多开发者在Swift里尝试创建NSProxy子类并添加自定义初始化方法时,都会碰到棘手的编译报错:要么是 Super init can't be called outside of the initializer,要么是 Super init isn't called on all paths before returning from initializer。这是因为Swift对NSProxy的初始化桥接逻辑和普通NSObject子类差异很大,直接在Swift子类里写初始化方法很难满足Swift严格的初始化安全检查。
临时解决办法:用Objective-C基类做中间层
虽然这看起来是个权宜之计,但确实能快速解决问题——先写一个Objective-C的NSProxy子类,封装好基础初始化逻辑,再让Swift子类继承这个OC类。
1. 创建Objective-C基类文件
首先新建一个Objective-C头文件(比如WorkingProxyBaseClass.h):
@interface WorkingProxyBaseClass : NSProxy - (instancetype)init; @end
然后是对应的实现文件(WorkingProxyBaseClass.m):
#import "WorkingProxyBaseClass.h" @implementation WorkingProxyBaseClass - (instancetype)init { if (self = [super init]) { // 可在此添加基类的初始化逻辑 } return self; } // 别忘了实现NSProxy必须的消息转发方法 - (id)forwardingTargetForSelector:(SEL)aSelector { return nil; // 根据业务需求替换逻辑 } - (void)forwardInvocation:(NSInvocation *)anInvocation { // 实现你的自定义消息转发逻辑 } - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { // 返回对应方法的签名,示例用NSObject的签名做兜底 return [NSObject instanceMethodSignatureForSelector:aSelector]; } @end
2. 在Swift中使用这个基类
现在你可以在Swift里继承这个OC基类,自由添加自定义初始化方法,不会再碰到之前的初始化报错:
class MySwiftProxy: WorkingProxyBaseClass { private let customProperty: String init(customValue: String) { self.customProperty = customValue super.init() } // 继续添加你的代理逻辑即可 }
为什么这个办法有效?
Objective-C对NSProxy的初始化规则没有Swift那么严苛,我们在OC层完成了和NSProxy父类的初始化交互,Swift子类只需要调用OC基类的init方法,就能绕过Swift编译器对NSProxy初始化的特殊检查。
内容的提问来源于stack exchange,提问作者Richard Topchii
相关产品推荐
相关产品推荐

