【问题标题】:Using NSArray for C-type int comparisons使用 NSArray 进行 C 类型的 int 比较
【发布时间】:2011-11-15 01:35:25
【问题描述】:

我想遍历一个整数的 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 中做这种事情吗?

【问题讨论】:

    标签: objective-c c ios nsarray


    【解决方案1】:

    您在其中缺少对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 somethings 不相互依赖。

    【讨论】:

      【解决方案2】:

      NSArray 是一个包含对象的数组,而不是原始类型。要将 C 整数放入数组中,通常将它们包装在 NSNumber 类的实例中。然后 NSArray 将包含 NSNumber 对象,您可以使用 intValue 方法轻松地从中获取原始值,因为@Regexident 演示了另一个发布的答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-29
        • 2012-02-27
        • 1970-01-01
        • 2020-08-13
        • 1970-01-01
        • 2013-11-29
        • 2017-12-18
        • 2014-05-17
        相关资源
        最近更新 更多