如何将Objective-C的initWithError:方法桥接为Swift的init() throws
解决方案
要实现你的需求,只需要在Objective-C的头文件中添加几个关键注解,就能让Swift自动将-initWithError:映射为抛出错误的init(),同时禁用默认的-init方法。修改后的Objective-C代码如下:
#import <Foundation/Foundation.h> @interface Foo : NSObject // 标记默认初始化方法不可用,防止Swift中被调用 - (instancetype)init NS_UNAVAILABLE; // 标记为指定初始化器,并告知Swift该方法会抛出错误 - (instancetype _Nullable)initWithError:(NSError **)error NS_DESIGNATED_INITIALIZER SWIFT_THROWS; @end
各注解的作用:
NS_UNAVAILABLE:直接在Objective-C中禁用默认的-init方法,这样Swift中Foo类的无参init()会被标记为不可用,开发者无法调用它。NS_DESIGNATED_INITIALIZER:告诉Swift这是类的指定初始化器,确保Swift能正确处理初始化链。SWIFT_THROWS:这是Clang的专属注解,专门用于桥接Objective-C到Swift时,将NSError**参数转换为Swift的throws机制,这样Swift中就会将这个方法暴露为init() throws。
Swift中的使用示例:
修改后,你在Swift里就可以这样使用Foo类:
do { let foo = try Foo() // 初始化成功,使用foo对象 } catch { // 初始化失败,处理错误 print("初始化Foo失败:\(error.localizedDescription)") }
这样既实现了将initWithError:转为Swift的抛出式初始化,又彻底禁用了容易引发问题的默认init()方法,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Andrew Madsen
相关产品推荐
相关产品推荐

