簡體   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