只有Objective-C 方法被转换为抛出Swift 方法,它们确实返回BOOL(不是小写的bool)或可空对象。
(使用 Xcode 11.7 和 Swift 5 语言测试。)
原因是 Cocoa 方法总是使用返回值 NO 或 nil
表示方法失败,而 not 只是设置了一个错误对象。
这记录在
Using and Creating Error Objects:
重要提示:成功或失败由方法的返回值指示。
虽然在 Cocoa 错误中间接返回错误对象的 Cocoa 方法
如果方法指示失败,则域保证返回此类对象
通过直接返回 nil 或 NO,您应该始终检查返回
在尝试对 NSError 对象执行任何操作之前,值为 nil 或 NO。
比如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;
-(BOOL)doSomething:(NSError **)error;
NS_ASSUME_NONNULL_END
@end
映射到 Swift 为
open class OClass : NSObject {
open func doSomethingWithArgument1(x: Int32, error: NSErrorPointer)
open func doSomethingWithArgument2(x: Int32) throws
open func doSomethingWithArgument3(x: Int32, error: NSErrorPointer) -> String
open func doSomethingWithArgument4(x: Int32) throws -> String
open func doSomething() throws
}
如果您可以更改方法的接口,那么您应该添加一个布尔值
返回值表示成功或失败。
否则你会从 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)));
映射到 Swift 为
public func doSomethingWithArgument5(x: Int32) throws
并且似乎“按预期”工作。但是,我找不到任何官方文档
关于这个属性,所以依赖它可能不是一个好主意。