为啥 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 【问题描述】:

NSArrayindexOfObjectPassingTest 方法,但是使用 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("");没事 紧急

java的 interface 可以有方法体

C++ 枚举类可以有方法吗?

方法中可以有方法吗?

如果项目未移动,是不是有方法检查 UICollectionView 项目拖动取消?

学习有方法,但没有捷径