我使用的NSSet以下星座:的NSSet使用词典:获取由值对象的关键
NSSet {
NSDictionary {
"Unique-Identifier-Key": Unique Value
"Key2": ValueABC
"Key3": ValueDEF
}
NSDictionary {
"Unique-Identifier-Key": Unique Value
"Key2": ValueFGH
"Key3": ValueJKL
}
NSDictionary {
"Unique-Identifier-Key": Unique Value
"Key2": ValueRST
"Key3": ValueXYZ
}
}
我在寻找一种方式来获得一个字典出的NSSet通过其独特的价值。 NSSet中有很多NSDictionaries,因此我正在寻找最佳性能的方式。
如何通过以下方式使用(NSSet *)objectsPassingTest:(BOOL (^)(id obj, BOOL *stop))predicate
?
NSString *idSearched = ...;
NSSet *results = [MySet objectsPassingTest:^(id obj,BOOL *stop){
if ([obj valueForKey:@"Unique-Identifier-Key"] == idSearched) return YES;
else return NO;
}];
这是最高性能的解决方案吗?据我所知,NSSet使用NSSet的性能比NSArrays更好。而且我不需要一个有序的对象序列。
谢谢,这听起来很合乎逻辑。如果Unique-Identifier-Key是NSString以外的对象(例如NSManagedObjectID)会怎样?我是否必须将该密钥转换为NSString,还是可以与其他类一起工作(我读过用于密钥的类必须采用NSCopying协议)?以及如何使用自定义键的性能? – FrankZp
@FrankZp:这是正确的,键必须采用'NSCopying',但你已经在字典中使用它,所以不应该有任何问题。使用自定义键时的性能直接关系到'hash'方法的质量。对于大多数Cocoa类型,例如'NSString','hash'方法非常好。绝对最坏的情况是O(n)的复杂性(这与你现在的搜索方式在概念上没有什么不同),但你仍然可以从更简单的代码中获益。 – dreamlax