Objective-C 中常用的数组选项



我正在尝试将我的python代码转换为Objective-C代码。在iOS或Objective-C世界中,开发人员最常使用的是什么,用于python中整数的列表列表?

例如:在 Python 中:l = [[1,1,1,1],[1,1,1,1]]

inObjective-C: NSArray* array [@[@1,@1,@1,@1,@1],@[@1,@1,@1,@1]] 这是最好的方法吗?

其他问题:

  • 访问元素的最佳方式是什么?(使用objectAtIndex?(
  • 从元素中减去值的最佳方法是什么?(如在Python l[0][0]-1中(

创建数组的方式是正确的。请记住,您输入的不是整数,而是NSNumbers的实例。基元类型不能添加到NSArraysNSDictionarys,这就是为什么你需要@符号。这是将价值转换为NSNumber的简略方法。

你可以像python一样访问你的元素。

NSArray *array = @[@[@1, @2, @3], @[@4, @5, @6]];
NSNumber *one = array[0][0];
NSInteger *oneInt = [one integerValue]; // Integer representation of the first element of the first array.
NSArray *array = @[@[@1, @2, @3], @[@4, @5, @6]];
NSNumber *one = [[array objectForIndex:0] objectForIndex:0];
NSInteger *oneInt = [one integerValue]; // Integer representation of the first element of the first array.

这两者都是访问数组元素的等效方式。您使用哪一个更多的是个人喜好。我更喜欢较短的版本。

简短的回答是"视情况而定"。 Objective-C支持C风格的数组(实际上只是进入内存缓冲区的指针和一些语义糖来处理指针数学(或NSArrays,它们是管理其他对象的容器对象。正如@user7716368在他们的(非常好的(答案中所说,你不能直接将整数放入NSArray中。您必须创建NSNumber对象,其中是数值的对象包装器。

在Objective-C中还有2种不同风格的NSArray,不可变和可变数组。不可变数组一旦创建就无法更改。因此,如果你想从嵌套数组中索引 [1][2] 处的值中减去 6,你必须使嵌套结构中的所有数组都可变数组。

如果需要静态定义的整数数组或整数数组的数组,则值得考虑使用 C 语法:

int intsArray[] = {1, 2, 3, 4};
printf("array index 1 = %dn", intsArray[1]);
int intsNestedArrays[2][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
printf("intsNestedArrays[1,1] = %dn", intsNestedArrays[1][1]);

请注意,C 样式的二维数组不能"参差不齐"(其中第 2 级数组具有不同的条目数。它们必须是一个矩阵。Objective-C NSArrays可以"破烂"。

编辑:

请注意,Swift 的数组比 Objective-C 的更明智。数组是对象,整数是对象,但执行速度几乎与 C 风格的内存缓冲区数组一样快,并且具有许多非常强大的面向对象和功能功能。

如果你只是在 Objective-C 中学习整数数组,你可能应该停止研究 Objective-C 并切换到 Swift。Objective-C 即将淘汰,而 Swift 是大多数人和组织(包括我(投入精力的地方。我预测,在5年内,Objective-C将在苹果平台上几乎死亡,甚至可能得不到支持。

Q1。访问元素的最佳方式是什么?(使用objectAtIndex?(

问题 2.从元素中减去值的最佳方法是什么?(就像在蟒蛇中一样 L[0][0]-1(

答1: 您可以通过array[0][1];[[array objectAtIndex:0] objectAtIndex:1];访问 没有最好的方法,两者都是一样的。

答2: 取决于您的问题要求: a( 如果您只想计算并存储在另一个变量中,那么:

int var = [array[0][1] intValue] - 2;

b( 如果要替换扣除后的值: - 你不能使用NSArray,因为这是固定的。您需要使用 NSMutableArray。 所以假设数组是 NSMutableArray,你可以执行以下操作:

array[0][1] =  @([array[0][1] intValue] - 2);

最新更新