[英]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.