为什么AnyObject []在Obj-C Class中从NSArray桥接成功"成功"在Swift关闭?

时间:2014-06-26 16:54:33

标签: objective-c closures swift objective-c-blocks

我在Obj-C类中有一个类方法:

+ (void) tagsFetchForID:(NSNumber *) tID 
successful:(void (^)(NSArray *tags)) successful
failure:(void (^)()) failure;

这在Swift之前运行良好,在上面的方法的实现中使用名为successful()的函数将结果数组传递给曾经是另一个Obj-C类的处理块,然后做了必要的数组中的一些数据(这是一个异步的HTTP情况,几个级别下来,但那部分仍然是Obj-C,仍然肯定工作)。

该方法以一种代码完成的方式桥接到Swift:

PotsSharedData.tagsFetchForID(<tID: NSNumber?>, 
successful: <((AnyObject[]!) -> Void)?>, 
failure: <(() -> Void)?>)

...我已经变成了这个:

PotsSharedData.tagsFetchForID(transactionID, 
successful: { (fetchedTags: AnyObject[]!) -> Void in

}, 
failure: {

})

我没有从fetchedTags获得任何东西,尽管当我在Obj-C方面中断时,传递到successful()函数的数组非常多:

(lldb) po tagArray
<__NSCFArray 0x10d024060>(
{
    tag = "Tag Multiple Words";
    tagid = 2728;
},
{
    tag = SingleWordTag;
    tagid = 2729;
}
)

这是一个字典数组,每个字典都带有NSString标记和NSNumber tagid,带有NSString键。

在斯威夫特,我几乎什么都没得到:

(lldb) po fetchedTags
 {
  value = None
}
(lldb) 

我不知道从哪里开始。至于Swift的单一类型集合规则goa,我希望数组很好但是字典可能就是问题,因为有两种类型(NSString和NSNumber)都有特定的桥接行为。

我想了解为什么会发生这种情况,以及我可能会做些什么来解决它,记住我一次尝试攻击Swift一个类,并且不准备迁移这个特别是Obj-C课直到最后。

编辑:即使大大简化为字符串数组,结果也是一样的。这是Obj-C方法的完整实现:​​

+ (void) tagsFetchForID:(NSNumber *) tID 
successful:(void (^)(NSArray *tags)) successful
failure:(void (^)()) failure {

NSArray *ar = @[@"one",@"two",@"three"];
successful(ar);
}

在调用方法时,我仍然只在Swift类中成功关闭后收到一个空的optional / nil。我还尝试了一个我自己的NSObject子类的对象数组,以避免任何桥接尝试,但结果仍然相同。

1 个答案:

答案 0 :(得分:0)

因为Objective-C中没有泛型。由于Swift中的泛型,当您声明一个字符串数组时,该数组只能保存字符串。尝试将Int放入,编译器会发出警告。在Objective-C中,您可以将任何内容放在数组(或字典)中,并且由您自己决定该集合包含的内容。 Swift允许使用AnyObject类型的这种行为,这就是为什么你的调用以这种方式桥接。