我有一些Objective-C的遗留代码,它声明了像
- (void)doSomethingWithArgument:(ArgType)argument error:(NSError **)error
如此处所写https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html
Swift自动将产生错误的Objective-C方法转换为根据Swift的本机错误处理功能抛出错误的方法。
但是在我的项目中,描述的方法是这样的:
object.doSomething(argument: ArgType, error: NSErrorPointer)
此外,当我尝试使用它们时,它会引发运行时异常:
let errorPtr = NSErrorPointer() object.doSomething(argumentValue, error: errorPtr)
我还需要更多东西来将Objective-C的“ NSError **”方法转换为Swift的“ trows”方法吗?
BOOL在Swift中,只有返回a 或(可为空)对象的Objective-C方法才转换为throwing方法。
BOOL
其原因是,Cocoa方法总是用一个返回值NO或nil 指示的方法的失败,而 不是 只设置一个错误对象。使用和创建错误对象中对此进行了说明 :
NO
nil
重要提示: 方法的返回值指示成功或失败。尽管在方法可通过直接返回nil或NO指示失败的情况下,保证在该Cocoa错误域中间接返回错误对象的Cocoa方法可以保证返回此类对象,但是在尝试使用该方法执行任何操作之前,应始终检查返回值是否为nil或NO。 NSError对象。
例如,Objective-C界面
@interface OClass : NSObject NS_ASSUME_NONNULL_BEGIN -(void)doSomethingWithArgument1:(int) x error:(NSError **)error; -(BOOL)doSomethingWithArgument2:(int) x error:(NSError **)error; -(NSString *)doSomethingWithArgument3:(int) x error:(NSError **)error; -(NSString * _Nullable)doSomethingWithArgument4:(int) x error:(NSError **)error; NS_ASSUME_NONNULL_END @end
被映射为Swift
public class OClass : NSObject { public func doSomethingWithArgument1(x: Int32, error: NSErrorPointer) public func doSomethingWithArgument2(x: Int32) throws public func doSomethingWithArgument3(x: Int32, error: NSErrorPointer) -> String public func doSomethingWithArgument4(x: Int32) throws -> String }
如果可以更改方法的接口,则应添加一个布尔返回值以指示成功或失败。
否则,您可以从Swift调用它为
var error : NSError? object.doSomethingWithArgument(argumentValue, error: &error) if let theError = error { print(theError) }
备注: 在
我发现Clang具有强制执行函数在Swift中引发错误的属性:
-(void)doSomethingWithArgument5:(int) x error:(NSError **)error __attribute__((swift_error(nonnull_error)));
public func doSomethingWithArgument5(x: Int32) throws
并且似乎“按预期”工作。但是,我找不到有关此属性的任何官方文档,因此依靠它可能不是一个好主意。