Objective-C中常用的数组选项

时间:2017-07-27 17:57:09

标签: python ios objective-c arrays

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

例如:
Python :l = [[1,1,1,1],[1,1,1,1]]
Objective-C :NSArray *数组[@ [@ 1,@ 1,@ 1,@ 1],@ [@ 1,@ 1,@ 1,@ 1]] 这是最好的方式吗?

其他问题:

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

3 个答案:

答案 0 :(得分:2)

您创建阵列的方式是正确的。请记住,您没有输入整数,而是输入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.

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

答案 1 :(得分:2)

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

在Objective-C,不可变和可变阵列中还有两种不同风格的NSArray。一旦创建了不可变数组,就无法对其进行更改。因此,如果您想从嵌套数组中的索引[1] [2]的值中减去6,则必须使嵌套构造中的所有数组都成为可变数组。

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

int intsArray[] = {1, 2, 3, 4};
printf("array index 1 = %d\n", intsArray[1]);

int intsNestedArrays[2][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
printf("intsNestedArrays[1,1] = %d\n", intsNestedArrays[1][1]);

请注意,C风格的二维数组不能"参差不齐" (其中第二级数组具有不同数量的条目。)它们必须是矩阵。 Objective-C NSArrays 可以"参差不齐"。

编辑:

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

如果您只是在Objective-C中使用整数数组,那么您应该停止学习Objective-C并切换到Swift。 Objective-C正在走出困境,Swift是大多数人和组织(包括我在内)投入精力的地方。我预测,在5年内,Objective-C将在苹果平台上消失,甚至可能不受支持。

答案 2 :(得分:1)

  

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

     

Q2。从元素中减去值的最佳方法是什么? (就像Python一样   L [0] [0] -1)

ANS1: 您可以array[0][1];[[array objectAtIndex:0] objectAtIndex:1];进行访问 没有最好的办法,两者都是一样的。

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

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

b)如果要在扣除后替换值: - 您无法使用NSArray,因为这是固定的。您需要使用NSMutableArray。 所以假设array是NSMutableArray,你可以这样做:

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