objective-c - 使用 NSArray 进行 C 类型的 int 比较

标签 objective-c c ios nsarray

我想遍历 NSArray 的整数并将每个整数与特定的整数进行比较。所有的整数都是 C 类型的整数。

我使用的代码如下:

-(int)ladderCalc: (NSArray*)amounts: (int)amount 
{
    int result;

    for (NSUInteger i=0; i< [amounts count]; i++) 
    {
        if (amount < [amounts objectAtIndex:i]);
        {
            // do something
        }
        // do something
    }
}

但是,在将 int amount[amounts objectAtIndex:i] 的结果进行比较时出现错误,因为您无法将 id 与 int 进行比较。为什么会涉及到id? objectAtIndex 不应该只返回指定索引处的对象吗?是否可以将返回的对象转换为 C int 然后进行比较?

或者我应该放弃 NSArray 并在 C 中做这种事情吗?

最佳答案

你在那里错过了对 intValue 的调用(假设你的数组包含 NSNumber 的实例,这是公平的假设)。

另外,为了性能起见,您可能希望只调用一次[amounts count],如下所示:

-(int)ladderCalc:(NSArray *)amounts:(int)amount 
{
    int result;
    NSUInteger amountCount = [amounts count];
    for (NSUInteger i = 0; i < amountCount; i++) 
    {
        if (amount < [[amounts objectAtIndex:i] intValue]);
        {
            // do something
        }
        // do something
    }
}

由于(系统优化的)快速枚举,这里的速度更快:

-(int)ladderCalc:(NSArray *)amounts:(int)amount 
{
    int result;
    for (NSNumber *amount in amounts) {
        if (amount < [amount intValue]) {
            // do something
        }
        // do something
    }
}

由于并发执行,一个比前一个更快:

-(int)ladderCalc:(NSArray *)amounts:(int)amount 
{
    int result;
    [amounts enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSNumber *amount, NSUInteger idx, BOOL *stop) {
        if (amount < [amount intValue]) {
            // do something
        }
        // do something
    }];
}

警告:由于并发性,最后一个版本要求您的//do something彼此不依赖。

关于objective-c - 使用 NSArray 进行 C 类型的 int 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8130472/

相关文章:

c - Malloc 堆栈溢出

objective-c - 如何让这张图片显示在我的电子邮件正文中?

ios - iPhone - 如何从一组 UILabel 中进行选择?

objective-c - 我需要删除启用 ARC 的项目中的所有内存管理方法吗?

c++ - 我如何在 flex 和 bison 中使用 C++?

c - C中++val++和++*p++的解释

ios - 跨 ViewController 设置和访问全局属性的正确方法是什么?

ios - 一个额外的 BarButtonItem

ios - 在 iOS 7 中使用新的格式字符串说明符配置字典(复数支持)

ios - 将 swift 闭包转换为 block