为什么我不能专门研究Swift中的NSSet?

时间:2015-09-18 18:28:49

标签: swift

从xcode 7开始,基础集合是泛型,非常好,所以你可以在ObjC中做到这一点:

NSSet<NSString *> *foo = [[NSSet alloc] initWithArray:@[]];

但是如果你试图在Swift中专门化NSSet:

let foo:NSSet<String> = NSSet(array: [])

你得到了这个:Cannot specialize non-generic type 'NSSet'

现在,我知道Swift有一个Set类,它是通用的并且与NSSet桥接,但是我为NSManagedObject子类做这个,所以我需要支持{{1}同样在Swift中没有有序集。

我的问题是,这是故意还是疏忽?是否有任何理由NSOrderedSet不会在Swift中作为泛型类公开,而是在ObjC中?

1 个答案:

答案 0 :(得分:7)

正如documentation所说:

  

所有.controller('CommentsCtrl',function($scope,$http,$routeParams,getCommentsFactory){ $scope.param = $routeParams.id; $scope.comments = []; getCommentsFactory.getComments() .then(function(data){ console.log(data); }); ... 个对象都可以桥接到Swift集,因此Swift编译器在导入Objective-C API时会用NSSet类替换为NSSet

所以,正如亚特已经在答案中用其他词语说的那样,Swift语言中的Set<AnyObject>NSSet相同,而与<{em>不同于{{ 1}}在当前版本的Objective-C语言中,即使它们具有相同的名称。

继续引用文件:

  

您也可以按照上面列出的相同桥接规则直接从Swift数组文字创建Set<AnyObject>对象。当您显式地将常量或变量键入为NSSet对象并为其指定数组文字时,Swift会创建一个NSSet对象而不是Swift集。

换句话说,它创建了一个NSSet类型的对象,这就是Swift编译器给出错误的原因(NSSet不是通用的,因为它对应于泛型{{1在Object-C中,但已在Set<AnyObject>类型上实例化

你能做的就是写下:

NSSet