gpt4 book ai didi

ios - Swift 不会将 Objective-C NSError** 转换为抛出

转载 作者:IT王子 更新时间:2023-10-29 05:13:06 24 4
gpt4 key购买 nike

我有一些 Objective-C 遗留代码,声明方法如下

- (void)doSomethingWithArgument:(ArgType)argument error:(NSError **)error

写在这里https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html

Swift automatically translates Objective-C methods that produce errors into methods that throw an error according to Swift’s native error handling functionality.

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

object.doSomething(argument: ArgType, error: NSErrorPointer)

此外,当我尝试像这样使用它们时,它会抛出运行时异常:

let errorPtr = NSErrorPointer()
object.doSomething(argumentValue, error: errorPtr)

我是否需要更多的东西来将 Objective-C 的“NSError **”方法转换为 Swift 的“trows”方法?

最佳答案

只有 Objective-C 方法被转换为抛出 Swift 方法,它返回一个 BOOL(不是小写的 bool ),或者一个可为空的对象。(使用 Xcode 11.7 和 Swift 5 语言测试。)

原因是 Cocoa 方法总是使用返回值 NOnil指示方法失败,只是设置一个错误对象。这记录在 Using and Creating Error Objects :

Important: Success or failure is indicated by the return value of the method.Although Cocoa methods that indirectly return error objects in the Cocoa errordomain are guaranteed to return such objects if the method indicates failureby directly returning nil or NO, you should always check that the returnvalue is nil or NO before attempting to do anything with the NSError object.

例如,Objective-C 接口(interface)

@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
}

如果你可以改变你的方法的接口(interface),那么你应该添加一个 bool 值返回值指示成功或失败。

否则你会从 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

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

关于ios - Swift 不会将 Objective-C NSError** 转换为抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34786115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com