objective-c - 检查 NSString 是否存在于 NSArray 中的自定义对象中

标签 objective-c ios nsarray

我有一个 NSArrayStore 对象。每个 Store 对象都有两个 NSString 对象; StoreIDName。 我想快速检查此 NSArray 中是否存在带有 Store 对象的 ID。

例子:

Store *s1 = [[Store alloc] init];
s1.name = @"Some Name";
s1.id = @"123ABC";

Store *s2 = [[Store alloc] init];
s2.name = @"Some Other Name";
s2.id = @"ABC123";

NSArray *array = [[NSArray alloc] initWithObjects:s1, s2, nil];

NSString *myIdOne = @"ABCDEF";
NSString *myIdTwo = @"123ABC";

BOOL myIdOneExists = ...?
BOOL myIdTwoExists = ...?

它是 ...? 我需要弄清楚。我知道我可以使用 for 循环来做到这一点,并在找到时中断...但这在我看来是一种令人讨厌的方法,因为 NSArray 可能包含数千个对象。 ..理论上。
所以我想知道一个更好的解决方案。

最佳答案

事情是这样的:无论您采用何种解决方案,它或多或少都会归结为“遍历数组并返回是否找到对象”。除非满足非常特定的条件(例如,数组已经按您正在搜索的值排序),否则没有比这更快的搜索数组的方法。您可以使用谓词,可以使用枚举器,可以使用快速枚举,也可以使用测试 block ——在幕后,它们都相当于“遍历数组并执行测试”。这就是数组的工作原理。

如果这是您需要经常做的事情并且性能是天真的解决方案的问题,一个明智的解决方案可能是将您的 ID 缓存在 NSSet 中。集合针对快速成员检测进行了调整,因此您应该能够比使用数组更快地获得答案。

我个人的“数组循环”解决方案:

BOOL idExists = NSNotFound != [stores indexOfObjectPassingTest:^(Store *store, NSUInteger idx, BOOL *stop) {
    return [store.id isEqualToString:@"whatever"];
}];

(在浏览器中编写,所以,你知道,请注意编译器。)

关于objective-c - 检查 NSString 是否存在于 NSArray 中的自定义对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13748511/

相关文章:

ios - 有没有办法使用 Swift 中的速率属性来倒带音乐?

ios - 在 UITableView 中列出目录的内容

ios - 如何以编程方式填充 switch case 值?

ios - 实现可点击形状的最佳方法?

iOS, "swipe to view next image"和 "tap to hide ui"是默认功能吗?

objective-c - 带有自定义阴影的自定义 NSWindow

ios - 将值传递给闭包?

ios - 如何验证多维 NSArray 结构?

iphone - 如何在 iPhone 中构建 Instant Messenger?

ios - 自定义 UICollectionViewLayout : Get size of a certain cell