从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中?
答案 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