【问题标题】:Objective C Array of Array of StringsObjective C Array of Strings
【发布时间】:2015-10-31 17:31:55
【问题描述】:

我正在尝试创建一个字符串数组,以便最终可以提取出类似 ArrayOfArrays[0][1] = "hi" 的内容。

NSString *ArrayOne[] = {@"hello", @"hi"};
NSString *ArrayTwo[] = {@"goodbye", @"bye"};

NSArray *ArrayOfArrays[] = {@[*ArrayOne, *ArrayTwo]};

但是,当我尝试执行此操作时,出现错误:Initializer element is not a compile-time constant。

我读到这是因为我正在创建一个具有动态值的数组,尽管它应该是静态的。不知道如何解决这个问题。

关于制作字符串数组的任何建议?

【问题讨论】:

标签: objective-c


【解决方案1】:

如果您想在创建后修改它,请使用NSArray,或者更确切地说是NSMutableArray

NSMutableArray *arrayOne = [@[@"hello", @"hi"] mutableCopy];
NSMutableArray *arrayTwo = [@[@"goodbye", @"bye"] mutableCopy];
NSMutableArray *arrayOfArrays = [@[arrayOne, arrayTwo] mutableCopy];

还有其他方法可以初始化它,但这是允许您使用Objective-C 文字语法的唯一方法

您不能像您的代码尝试那样在 Objective-C 集合类中存储普通的 C 数组。

【讨论】:

  • 感谢您的建议。当我使用此代码时,对于 arrayOne 和 arrayTwo,我得到相同的“Initializer element is not a compile-time constant”和“'NSMutableArray' 类型的集合元素不是 Objective-C 对象”——有什么提示吗?跨度>
  • @NadirBilici 嗯,我不明白为什么。你确定你完全复制了吗?
【解决方案2】:

你写道:

应该是静态的

如果这是你想要的,那么你对 C 数组的使用是非常有效的,你只是语法错误。您可以使用:

NSString *arrayOfArrays[][2] =
{  {@"hello", @"hi"},
   {@"goodbye", @"bye"},
};

重要提示:2inner 数组中元素的数量,添加更多对时不要更改它。

这将为您提供一个编译时静态数组。

如果您正在制作的是从一个单词到另一个单词的映射,那么您最好使用 字典,例如:

NSDictionary *wordMap =
   @{ @"hello" : @"hi",
      @"goodbye" : @"bye"
    };

访问一个元素变成:

wordMap[@"hello"];

注意:这里的字典“常量”实际上是执行代码; C 数组版本可以显示为全局或本地初始化程序,而字典初始化必须在方法/函数中完成 - 但它可以分配给全局。

HTH

【讨论】:

    【解决方案3】:
    NSArray *array = @[
                       @[[ @"hello", @"hi" ] mutableCopy],
                       @[[ @"goodbye", @"bye" ] mutableCopy],
                      ];
    
    NSLog(@"%@ is short for %@", array[0][1], array[0][0]);
    

    输出:hi 是 hello 的缩写

    【讨论】:

    • 当 OP 执行 ArrayOfArrays[0][1] = "hi"; 时会发生什么?
    • @rmaddy 赋值语句在问题的第一句话中。
    猜你喜欢
    • 1970-01-01
    • 2018-08-23
    • 2018-09-10
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多