【问题标题】:Objective-C: Filing an NSMutableArray with 0's and Summing Its ContentsObjective-C:用 0 归档一个 NSMutableArray 并将其内容求和
【发布时间】:2012-03-25 12:31:12
【问题描述】:

我正在尝试创建一个最初用零填充的 NSMutableArray。随着时间的推移,数组元素会发生变化,我想对它们求和。以下代码说明了我遇到的两个问题。首先, NSLog 的输出应该给我一串零,但事实并非如此。即使我没有对数组做任何事情,我也会得到如下输出:

array[] = 14794004, 0, 0, 0, 1, 0, 0, 0, 0
array[] = 63, 30, 80828660, 80792872, 0, 80828564, 7478, 78955136, 1

NSLog 行只是为了确认数组的内容。那么为什么数组元素不为零,为什么它们会自发改变呢?一旦我解决了第一个问题,我如何对数组元素求和?提前致谢。

NSMutableArray *array;
int arraySum = 0;

array = [NSMutableArray arrayWithObjects: 0,0,0,0,0,0,0,0,0,nil];

NSLog(@"array[] = %i, %i, %i, %i, %i, %i, %i, %i, %i", array[0], array[1], array[2], array[3], array[4], array[5]), array[6], array[7], array[8];

for (int i = 0; i < 9; i++) {
    arraySum =  arraySum + array[i];  //Gives error: Invalid operands to binary + (have 'int' and 'struct NSMutableArry')
}                           //Isn't array[i] just one element and in this case a number?
NSLog(@"arraySum = %i", arraySum);

【问题讨论】:

    标签: objective-c nsmutablearray


    【解决方案1】:

    NSArray 适用于 Objective-C 类,而不是内置的 C 数据类型。

    此外,它没有下标运算符,这意味着您无法使用

    检索其内容
    array[n];
    

    你必须使用:

    [array objectAtIndex:n];
    

    注意,从 Xcode 4.5 开始,编译器确实支持下标语法,它会在后台转换为适当的方法调用。所以array[n] 在现代 Objective-C 中是有效的。

    如果您想将数字类型(intlongfloatdouble...)存储在 NSArray 中,则必须将它们包装在 NSNumber 中。

    NSArray* array = [NSMutableArray arrayWithObjects: [NSNumber numberWithInt:0], [NSNumber numberWithInt:0], [NSNumber numberWithInt:0], [NSNumber numberWithInt:0], nil]    
    

    那么你将内容总结如下:

    for(NSNumber* num in array)
    {
      arraySum += [num intValue];
    }
    

    【讨论】:

    • 作为 C 和 Objective-C 的新手,很难保持两者一致。谢谢。
    • 很高兴我能帮上忙。别担心,你会习惯的。顺便说一句,如果此答案对您有所帮助,请随时单击复选标记并将其标记为您问题的选定答案。
    • 这个答案在给出时是正确的,但同时添加了对下标的支持。从 Xcode 4.5 开始,可以做到array[n]。作为奖励,@(0) 现在可以作为[NSNumber numberWithInt:0] 的不那么冗长的替代品。
    • @Janosch 你是对的。但是,您也可以争辩说问题本身已经过时,应该修改。
    • @dandan78:是的。此外,我的评论是否发布在问题下方可能更容易查看。但是话又说回来,作为一般规则,更新旧答案而不是旧问题可能会更好,因为如果您更改问题,多个答案可能不再有意义。也许我应该对 meta.so 做几个小时的研究来决定下一次;)
    【解决方案2】:

    dandan78给出了明确的解释。

    只有一个小提示:NSArray/NSMutableArray 是与可可一起使用的 DE FACTO 类。 对于“C”程序员来说,它们有点奇怪,你不能使用指针算法,即使你看到“*”。

    所以请使用它们,但对于非常大的数值数组来说,它们与“C”数组相比非常昂贵且速度慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-18
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多