【发布时间】:2016-03-15 05:17:47
【问题描述】:
我正在开发一个需要与现有 Objective-c api 交互的快速项目。不过,我在其中一个功能上遇到了一些障碍。在objective-c头文件(OrderItem.h)中我有这个函数定义:
+ (NSString *_Nullable)getOptional:(NSString *_Nonnull)foo error:(NSError *_Nullable *_Nullable)error;
特别注意最后一个参数;因为它是一个错误指针,所以在 swift 中调用此方法需要包装在错误处理程序中(do .. catch)。
这里是对应的.m文件:
+ (NSString *)getOptional:(NSString *)foo error:(NSError *__autoreleasing *)error
{
if([foo isEqualToString:@"abc"])
{
return @"abc item";
}
else
{
if([foo isEqualToString:@"xyz"])
{
*error = [[NSError alloc] init];
}
return nil;
}
}
然后我在我的 swift 文件中添加了以下代码:
func testGetOptional()
{
do
{
var result:NSString? = try OrderItem.getOptional("abc");
XCTAssertNotNil(result);
result = try OrderItem.getOptional("123");
XCTAssertNil(result);
}
catch let error as NSError
{
XCTFail("OrderItem lookup should not have thrown an error. Error was " + error.localizedDescription);
}
}
没有什么特别复杂的;对 getOptional 的两次调用实际上都不应该导致错误。但是,当我运行该功能时,“123”案例正在爆炸并导致测试失败。当我仔细观察时,似乎我的objective-c 的桥接版本将返回类型定义为Nonnull (-> OrderItem),即使我在objective-c 中明确将其定义为Nullable。更奇怪的是,如果我在没有最终的“错误”参数的情况下声明相同的函数,那么桥接版本将具有正确的返回类型 Nullable (-> OrderItem?)。
有人能解释一下这里发生了什么吗?更重要的是,有没有办法解决这个问题?
【问题讨论】:
-
在您的
.m文件中,返回类型是+(NSString *),而不是_Nullable -
.m文件的返回类型没有区别,swift使用的桥接文件是基于.h文件的。可以肯定的是,我确实尝试将 _Nullable 添加到 .m 但结果是相同的。
-
@pbuchheit:这是意料之中的。带有错误参数的函数被转换为 Swift 作为抛出错误的函数(
NULL返回值表示错误)。请参阅developer.apple.com/library/ios/documentation/Swift/Conceptual/… 中的“错误处理”。 -
那么有没有办法处理方法可以返回值或抛出我们需要处理的错误的情况?
标签: objective-c swift optional throw bridging-header