繁体   English   中英

如何编写带有throws语句的swift 3方法和可以在Objective C中使用的返回值?

[英]How to write swift 3 method with throws statement and return value that can be used in Objective C?

下面的Swift 3方法被翻译成Objective C,如:

func doSomething(param: String) throws // Swift 3

- (BOOL)doSomething:(NSString * _Nonnull)param error:(NSError * _Nullable * _Nullable)error; // Translated Objective C

那么,如何编写一个包含throws和return类型的方法?

func doSomething(param: String) throws -> Int // Swift 3

// Error: Never translated into Objective C

我知道流不应该由NSError对象处理。 它只包含有关错误的信息。 这就是为什么有一个BOOL返回类型让我们知道调用成功没有任何问题。

那我怎么能用throws语句和返回类型处理一个方法? 有没有一种标准的方法来处理这个问题?

先感谢您。

在Objective-C中报告成功或失败的标准方法是返回布尔值NOnil对象指针,如使用和创建错误对象中所述

重要说明:方法的返回值表示成功或失败。 虽然在Cocoa错误域中间接返回错误对象的Cocoa方法可以保证返回这样的对象,如果方法通过直接返回nil或NO来指示失败,你应该在尝试对之做任何事情之前检查返回值为nil或NO。 NSError对象。

所以你可以返回一个对象的实例

func doSomething(param: String) throws -> NSNumber

这被翻译成

- (NSNumber * _Nullable)doSomethingWithParam:(NSString * _Nonnull)param error:(NSError * _Nullable * _Nullable)error;

如果抛出错误则返回nil ,或返回布尔值并通过引用返回其他值

func doSomething(param: String, value: UnsafeMutablePointer<Int>) throws

映射到

- (BOOL)doSomethingWithParam:(NSString * _Nonnull)param value:(NSInteger * _Nonnull)value error:(NSError * _Nullable * _Nullable)error;

试试这个:

- (int) doSomething:(NString *)param error:(NSError * _Nullable *)error;

如果可以修改throwable对象,还有另一种方法可以解决这个问题。

如果您可以为错误添加枚举,并使用@objc注释错误枚举,则自动桥接头将其转换为NSError,如前所述。

例如:

@objc enum MyError:Int, Error{
    case AnError
    case AnotherError
}

而你的投掷快速方法:

public class MyClass:NSObject{

    public func throwAnError() throws {
        throw MyError.AnotherError
    }

    public func callMe(){
        print("Someone called!")
    }

}

将通过自动桥接过程转换为:

SWIFT_CLASS("_TtC13ErrorHandling7MyClass")
@interface MyClass : NSObject
- (BOOL)throwAnErrorAndReturnError:(NSError * __nullable * __null_unspecified)error;
- (void)callMe;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

摘自这篇与此问题相关的优秀博客文章的底部。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM