为啥 NSArray 有方法 indexOfObjectPassingTest 而不是像 NSSet 这样的 objectsPassingTest?
Posted
技术标签:
【中文标题】为啥 NSArray 有方法 indexOfObjectPassingTest 而不是像 NSSet 这样的 objectsPassingTest?【英文标题】:Why NSArray have the method indexOfObjectPassingTest and not objectsPassingTest like NSSet?为什么 NSArray 有方法 indexOfObjectPassingTest 而不是像 NSSet 这样的 objectsPassingTest? 【发布时间】:2016-12-15 14:22:17 【问题描述】:NSArray 有 indexOfObjectPassingTest 方法,但是使用 NSSet 您可以使用 方法直接获取对象>objectsPassingTest.
我知道,在给定索引的情况下从 NSArray 中获取对象是微不足道的,但是您必须对其进行编码 :),当然在 NSSet 中您不需要有索引,所以它必须返回一个对象。
所以问题是为什么这些数据类型对同一任务有不同的方法(通过一些测试找到一个元素)而不是实现 objectsPassingTest?。
【问题讨论】:
@danh 对filteredArrayUsingPredicate:
提出了很好的观点。 (我已经删除了他评论的答案,因为我认为他的评论比我的答案更好。)
【参考方案1】:
我不知道为什么NSArray
中没有类比。仔细阅读文档,很多收集方法都有一个多态孪生,但不是这个。
filteredArrayUsingPredicate:
可能非常适合大多数问题,但是为了匹配NSSet
签名,像这样扩展NSArray
并不是不合理的:
// NSArray+NotUnreasonableAddition.h
@interface NSArray (NotUnreasonableAddition)
- (NSArray *)objectsPassingTest:(BOOL (^)(id, BOOL *))test;
@end
// NSArray+NotUnreasonableAddition.m
@implementation NSArray (NotUnreasonableAddition)
- (NSArray *)objectsPassingTest:(BOOL (^)(id, BOOL *))test
NSMutableArray *result = [NSMutableArray new];
for (id obj in self)
BOOL stop = NO;
if (test(obj, &stop)) [result addObject:obj];
if (stop) break;
return result;
【讨论】:
【参考方案2】:因为从索引到对象是微不足道的,但从对象到索引却不是。
【讨论】:
以上是关于为啥 NSArray 有方法 indexOfObjectPassingTest 而不是像 NSSet 这样的 objectsPassingTest?的主要内容,如果未能解决你的问题,请参考以下文章
C# 线程中怎么调用有方法的窗体 窗体一闪就没有了 为啥线程中调用MessageBox.Show("");没事 紧急