当前位置: 首页 > 面试题库 >

Swift不会将Objective-C NSError **转换为throws

微生自怡
2023-03-14
问题内容

我有一些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的本机错误处理html" target="_blank">功能抛出错误的方法。

但是在我的项目中,描述的方法是这样的:

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方法。

其原因是,Cocoa方法总是用一个返回值NOnil 指示的方法的失败,而 不是
只设置一个错误对象。使用和创建错误对象中对此进行了说明


重要提示:
方法的返回值指示成功或失败。尽管在方法可通过直接返回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)
}

备注:

  • https://github.com/apple/swift/blob/master/test/Inputs/clang-importer-sdk/usr/include/errors.h

我发现Clang具有强制执行函数在Swift中引发错误的属性:

-(void)doSomethingWithArgument5:(int) x error:(NSError **)error
  __attribute__((swift_error(nonnull_error)));

被映射为Swift

public func doSomethingWithArgument5(x: Int32) throws

并且似乎“按预期”工作。但是,我找不到有关此属性的任何官方文档,因此依靠它可能不是一个好主意。



 类似资料:
  • 问题内容: 我知道大多数问题都是关于从Objective-C转换为Swift的,但是我正在寻找一种可以将Swift代码转换为Objective-C的工具。搜索所有内容时,我发现目标是迅速发展。 是的-我知道我可以使用桥头将快速代码放入Objective-C项目中-这不是我想要的。 我需要一个将Swift代码转换为Objective-C代码的工具。有这样的事吗? 问题答案: 没有此类工具可将Swif

  • 在SWIFT中,我无法将以下curl转换为url请求。 我尝试了以下方法,但在解压缩一个可选值错误时意外地发现为nil 我尝试了这个链接中的解决方案,在Swift中将curl转换为URL请求

  • 问题内容: 有没有一种方法可以将Swift结构的地址转换为无效的UnsafeMutablePointer? 我尝试了一下但没有成功: 谢谢! 编辑: 我实际上正在尝试 将上下文 移植到Swift中 学习CoreAudio 的第一个示例。 这是我到目前为止所做的: 我正在努力留在Swift中,但是如果事实证明这是一个问题而不是优势,那么我最终将链接到C函数。 编辑:底线 如果您因为试图在Swift中

  • 我想在Swift中将转换为。像这样的基本强制转换不起作用,因为这些类型不是原语,不像Objective-C中的s和s

  • 问题内容: 我在Swift 中将元素转换为,然后将变量转换回时遇到了问题。 首先,我想提取以下JSON数据的元素: 放入NSData 变量,但似乎无法做到这一点。我用来解析如下: 但这给了我一个ScalarNumber数组,我不知道如何存储到一个对象中。 其次,我想从同一个对象生成回来: 但是NSData 对象不会转换为[-67,51,-38,61,-72,102,48],它只是使JSON字符串无

  • 问题内容: 嗨,我有一个NSMutableArray,我尝试这样做: 如何将Int64变量添加到NSMutableArray()? 问题答案: 您正在使用基础数组(NSMutableArray),因此应使用基础编号对象: 您还可以使用本机swift数组: