2015-10-31 2 views
2

Я пытаюсь создать массив массивов строк, чтобы в конечном итоге вытащить что-то вроде ArrayOfArrays [0] [1] = "hi".Objective C Массив массива строк

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

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

Однако, когда я пытаюсь сделать это, я получаю сообщение об ошибке: Initializer элемент не является константой времени компиляции.

Я читал, что это потому, что я создаю массив с динамическими значениями, хотя он должен быть статическим. Не знаете, как обойти это.

Любые советы по созданию массива массивов строк?

+1

Где этот код? Это в начале файла .m вне любого метода? – rmaddy

+0

@rmaddy Ах да; хорошая точка зрения. – trojanfoe

+0

@Nadir Вам необходимо прочитать http://stackoverflow.com/questions/6143107/compiler-error-initializer-element-is-not-a-compile-time-constant?s=1|5.6746 – rmaddy

ответ

0

Использование NSArray, или, вернее, NSMutableArray, если вы хотите изменить его после создания:

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

Есть другие способы инициализируют, но это единственный способ, который позволяет использовать Objective-C буквальным синтаксис.

Вы не можете хранить простые массивы ol 'C в классе коллекции Objective-C, поскольку ваш код пытается сделать.

+0

Спасибо за совет. Когда я использую этот код, я получаю тот же «Инициализационный элемент не константа времени компиляции» для arrayOne и arrayTwo, а «Элемент коллекции типа« NSMutableArray »не является объектом Objective-C» - какие-либо советы? –

+0

@NadirBilici Хммм, я не понимаю, почему. Вы уверены, что скопировали его точно? – trojanfoe

-1
NSArray *array = @[ 
        @[[ @"hello", @"hi" ] mutableCopy], 
        @[[ @"goodbye", @"bye" ] mutableCopy], 
        ]; 

NSLog(@"%@ is short for %@", array[0][1], array[0][0]); 

Выход: привет является аббревиатурой привет

+0

И что происходит, когда OP делает 'ArrayOfArrays [0] [1] =" hi ";'? – trojanfoe

+0

@rmaddy Это утверждение присваивания находится в первом предложении вопроса. – trojanfoe

+0

@trojanfoe Лоб привкус. Неважно. – rmaddy

0

Вы писали:

it should be static

, если это то, что вы хотите, то использование массивов C вполне справедлива, вы только что получили синтаксис неправильно , Вы можете использовать:

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

Важно: 2 это количество элементов в внутренней массива, вы не измените его при добавлении дополнительных пар.

Это даст вам статический массив времени компиляции.

Если то, что вы делаете это карта от одного слова к другому, вы можете быть лучше с словаря, например:

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

и доступ к элементу становится:

wordMap[@"hello"]; 

Примечание: словарь «константа» здесь - фактически выполненный код; версия массива C может отображаться как глобальный или локальный инициализатор, а инициализация словаря должна выполняться в методе/функции - но она может назначаться глобальному.

HTH

Смежные вопросы