2015-07-27 2 views
0

Мне нужно добавить двойной массив (как в двойном примере [число емкости];) в nsmutablearray, но, похоже, это сложнее, чем я думал. Поэтому у меня есть:добавить двойной массив в nsmutable array

NSMutableArray *sample; 
double ex[2]; 

как глобальная переменная в моей .m файл

и в пустом методе с двумя двойными PARAMATERS, которые example1 и example2 Я пытаюсь

ex[0] = example1; 
ex[1] = example2; 

затем добавить этот ex-массив для nsmutablearray, однако, я получаю ошибку, если я это сделаю:

[sample addObject:ex]; 

кто-нибудь p помощь в аренде, я также новичок в этом, поэтому я не очень понимаю, как это сделать. Заранее спасибо!

Я чувствую, что я не объясняю себя, что ясно, поэтому я добавлю это.

So basically, I want my mutablearray to look like this: 

[[3.78,2.00], [4.6,8.90098], [67.9099, 56.788] ...] 

like that 
+0

Не уверен, но это, возможно, дубликат - пожалуйста, проверьте этот вопрос и ответ: http://stackoverflow.com/q/5469886/558933. Ваш массив 'ex' должен быть массивом C или может быть' NSArray' или 'NSMutableArray'? –

+0

это двойной массив :) – jane

+0

'{}' обозначает словарь, а не массив. –

ответ

2

Объекты Objective-C могут быть добавлены к NSMutableArray. Поскольку массив из double s равен , а не объект Objective-C, вам необходимо обернуть ваш массив в нечто, которое можно поместить в коллекцию Objective-C. Например, вы можете обернуть его в NSData:

NSData *wrapped = [NSData dataWithBytes:ex, length:sizeof(ex)]; 
[sample addObject:wrapped]; 

Конечно теперь вам нужно «разворачивать» ваш массив перед доступом к ней:

NSData *wrapped = [sample objectAtIndex:...]; 
double* tmp = (double*)wrapped.bytes; 
double x = tmp[0]; 
+0

что сработало! Но когда я пытаюсь выполнить nslog образца nsmutablearray, значение double больше не появляется и что-то вроде этого <00000000 00506c40 00000000 00487e40> – jane

+0

@jane Это потому, что 'NSData' не знает, что внутри, поэтому он печатает необработанные байты. Если вы извлечете данные путем распаковки, вы получите свои «двойные» значения. – dasblinkenlight

+0

О, нет .. :(Я пытаюсь использовать этот код double * tmp = (double *) wrapped.данные; но я получаю сообщение об ошибке «Данные свойства» не найдены на объекте типа «NSData». «Я чувствую себя настолько глупо сейчас, я собираюсь попробовать то, что предложил Metabble, но большое спасибо за усилия dasblinkenlight! Я ценю это много! – jane

3

В качестве альтернативы ответ Dasblinkenlight, вы также можете использовать NSArray NSNumbers и добавьте это в свой NSMutableArray.


double example1 = 1.113; 
double example2 = 129.74; 
NSMutableArray *sample = [[NSMutableArray alloc] init]; 
NSArray *ex = @[[NSNumber numberWithDouble: example1], [NSNumber numberWithDouble: example2]]; 
[sample addObject: ex]; 
NSLog(@"example1: %f, example2: %f", ((NSNumber*)sample[0][0]).doubleValue, ((NSNumber*)sample[0][1]).doubleValue); 
//logs example1: 1.113000, example2: 129.740000 

Вы можете добавить столько NSArrays из NSNumber, как вы хотите, и использовать sample[][], чтобы получить NSNumber, а затем легко разворачивать его с doubleValue.

Если вы хотите, чтобы оба измерения изменялись, просто установите NSNumbers в изменяемые массивы.

Изменить это:

NSArray *ex = @[[NSNumber numberWithDouble: example1], [NSNumber numberWithDouble: example2]]; 

к этому:

NSMutableArray* ex = [NSMutableArray arrayWithObjects: [NSNumber numberWithDouble: example1], [NSNumber numberWithDouble: example2], nil]; 
+0

, поэтому образец [] [] - это 2D-msmmablearray? Интересно .. Я бы попробовал это :) спасибо Metabble :) – jane

+0

sample будет измененным массивом, содержащим непеременные массивы. Таким образом, он изменен только в одном измерении. Однако это легко изменить. Я обновлю сообщение. – Metabble

+0

Это здорово! Большое спасибо Metabble :) – jane

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