从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 }