如何在Objective-C中从对象数组根据特定值获取对应对象
在Objective-C中从对象数组根据特定值获取对应对象的实现方法
嘿,你在Swift里用first(where:)的写法确实挺简洁的,在Objective-C里也有对应的实现方式,根据你项目支持的iOS版本,有几种不同的方案可以选:
1. iOS 9及以上版本(推荐)
从iOS 9开始,NSArray新增了firstObjectPassingTest:方法,和Swift的first(where:)逻辑几乎完全一致,用法非常直观:
// 替换成你实际的数组和目标id NSArray *layers = self.layers; NSString *targetId = @"要匹配的ID"; // 如果是数值类型就用NSInteger等 YourLayerClass *targetLayer = [layers firstObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { YourLayerClass *layer = (YourLayerClass *)obj; // 根据你的id类型调整判断方式:字符串用isEqualToString:,数值用== return [layer.id isEqualToString:targetId]; }]; if (targetLayer) { // 找到匹配对象,执行后续操作 }
这个方法会在找到第一个符合条件的对象后立刻停止遍历,效率和Swift的写法一样高,block里的*stop = YES还能手动触发终止(不过默认找到第一个就停了,一般不用额外设置)。
2. 兼容iOS 8及更早版本
如果需要支持更低版本的系统,就只能手动遍历数组了,逻辑也很简单:
NSArray *layers = self.layers; NSString *targetId = @"要匹配的ID"; YourLayerClass *targetLayer = nil; for (YourLayerClass *layer in layers) { if ([layer.id isEqualToString:targetId]) { targetLayer = layer; break; // 找到第一个匹配项就停止遍历,提升效率 } } if (targetLayer) { // 处理找到的对象 }
这种写法兼容性拉满,就是代码稍微长一点,但逻辑清晰易懂。
关键注意事项
- 记得把
YourLayerClass替换成你数组中实际的对象类名 - 字符串类型的
id一定要用isEqualToString:判断,别直接用==(==比较的是内存地址,不是字符串内容);如果是数值类型(比如NSInteger),直接用==就可以 - 如果数组可能为空,记得先做非空判断,避免崩溃
内容的提问来源于stack exchange,提问作者Parv Bhasker
相关产品推荐
相关产品推荐

