![](/img/trans.png)
[英]How can we write a user defined method is Objective C / Swift with completion handler
[英]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中報告成功或失敗的標准方法是返回布爾值NO
或nil
對象指針,如使用和創建錯誤對象中所述 :
重要說明:方法的返回值表示成功或失敗。 雖然在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.