Sets 集合

Objective-C 里有两种创建集合的方法,NSSet 和 NSCountedSet 。当然啦,和 NSSet 方法对应的,还有一个 NSMutableSet 方法,它可以创建一个可修改的集合。但是 NSCountedSet 方法默认创建出来的集合就是可修改的。

NSSet 其实没有什么好讲的,因为它几乎和 Swift 里的集合一模一样,但是功能性就没有 Swift 里那么强大。你可以使用 count 方法,来计算这个集合里有多少个元素。用 containsObject 方法,来判断这个集合里是否包含某个对象。用 intersectsSet 方法,来判断两个集合是否有重合的部分。

这些就和 Swift 是一样的,所以没有什么好讲的,我们来看例子吧~

NSSet *odd = [NSSet setWithObjects:@1, @3, @5, @7, @9, nil];
NSSet *even = [NSSet setWithObjects:@2, @4, @6, @8, @10, nil];
NSSet *combined = [odd setByAddingObjectsFromSet:even];
NSMutableSet *mutable = [combined mutableCopy];
[mutable addObject:@0];
[mutable removeAllObjects];

你可以像上面的代码一样用 setWithObjects 方法来创建数组,也可以用 setWithArray 方法在集合里创建 NSArray 类。

有趣的是 NSCountedSet,这个类我在 Hacking with Swift 和 Pro Swift 里都讲到过,这里我再简单地提一下。

集合的运行速度比数组要快得多,原因有二。首先,集合里的元素是无序排列的,也就是说这里的对象是可哈希的。其次,集合里的对象是不允许重复的。

NSCountedSet 稍微变通了一下上面这个规则。在 NSCountedSet 里,相同的对象也只能出现一次。但是每当你添加或删除这个对象时,它会记下你添加或删除的次数,这就让它在统计集合元素数量时,速度更快。

你可以看一看下面的这个例子,这段代码里创建了一个包含一些数字的集合,然后用 countForObject 方法,打印了每一个数字出现的次数。

NSCountedSet *numbers = [NSCountedSet setWithObjects: @1, @3, @2, @8,
@3, @6, @8, @8, @5, @1, @6, @3, nil];
for (NSString *value in [numbers allObjects]) {
    NSLog(@"%@ appears %ld times", value, [numbers
countForObject:value]);
}

results matching ""

    No results matching ""