从NSSet获取对象

如果无法从NSSet获取objectAtIndex的对象,那么如何检索对象?

有一组用例。 你可以通过enumerateObjectsUsingBlock或NSFastEnumeration来enumerateObjectsUsingBlock ,调用containsObject来testing成员资格,使用anyObject获得一个成员(不是随机的),或者用anyObject把它转换成一个数组(不是特定的顺序)。

当你不想重复,不关心订单,想要快速的会员资格testing时,一套是合适的。

NSSet没有方法objectAtIndex:

尝试调用allObjects,返回所有对象的NSArray。

如果您有某种唯一的标识符来select所需的对象,则可以使用filteredSetUsingPredicate。

首先创build谓词(假设你在对象中唯一的ID被称为“标识符”,它是一个NSString):

 NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"identifier == %@", identifier]; 

然后使用谓词select对象:

 NSObject *myChosenObject = [mySet filteredSetUsingPredicate:myPredicate].anyObject; 

NSArray *myArray = [myNSSet allObjects];

 MyObject *object = [myArray objectAtIndex:(NSUInteger *)] 

用所需对象的索引replaceNSUInteger。

NSSet使用方法isEqual :(其中,放入该对象的对象必须重写,另外还有散列方法)来确定对象是否在其内部。

所以,例如,如果你有一个数据模型,通过一个id值来定义它的唯一性(比如属性是:

 @property NSUInteger objectID; 

那么你会实现isEqual:as

 - (BOOL)isEqual:(id)object { return (self.objectID == [object objectID]); } 

你可以实现哈希:

 - (NSUInteger)hash { return self.objectID; // to be honest, I just do what Apple tells me to here // because I've forgotten how Sets are implemented under the hood } 

然后,你可以得到一个具有该ID的对象(以及检查它是否在NSSet中):

 MyObject *testObject = [[MyObject alloc] init]; testObject.objectID = 5; // for example. // I presume your object has more properties which you don't need to set here // because it's objectID that defines uniqueness (see isEqual: above) MyObject *existingObject = [mySet member: testObject]; // now you've either got it or existingObject is nil 

但是,从NSSet中获得某些东西的唯一方法是首先考虑定义其独特性的方法。

我没有testing什么更快,但我避免使用枚举,因为这可能是线性的,而使用member:方法会快得多。 这是喜欢使用NSSet而不是NSArray的原因之一。

对于Swift3和iOS10:

 //your current set let mySet : NSSet //targetted index let index : Int //get object in set at index let object = mySet.allObjects[index] 
 for (id currentElement in mySet) { // ** some actions with currentElement }