Как я могу сохранить значение с плавающей запятой в NSArray? - PullRequest
8 голосов
/ 06 апреля 2010
for ( tempI = 0; tempI < 10; tempI++ )  
{
    tempJ = 1;
    NSArray *objectsForArray = [NSArray arrayWithObjects:@"array[tempI][tempJ]", @"array[tempI][tempJ+1]",  @"array[tempI][tempJ+2]", nil];
}

Могу ли я написать код, как указано выше. Мне нужно хранить значение с плавающей точкой (array[][]) в NSArray. Могу ли я это сделать?
Моя проблема в том, что у меня есть матрица как

1.0   0.4   0.3   0.5  
2.0   0.4   0.5   0.5  
3.0   4.3   4.9   0.5  

Мне нужно получить значения (0,4, 0,3, 0,5), используя 1,0, 2,0 3,0. Как я могу использовать NSDictionary для этого?
Спасибо

for( tempI = 0; tempI < 5; tempI++)
{
        NSDictionary *dictionary[tempI] = [ [NSDictionary alloc] initWithObjects:@"array[tempI][tempI + 1]", @"array[tempI][tempI + 2]", @"array[tempI][tempI + 3]", @"array[tempI][tempI + 4]", @"array[tempI][tempI + 5]", nil];
}

Могу ли я написать таким образом? Objective C принимает это?

Я получаю ошибку как

error: variable-sized object may not be initialized

Ответы [ 2 ]

18 голосов
/ 06 апреля 2010

NSArray может хранить только объекты, но не примитивы, к счастью, класс NSNumber имеет вспомогательный метод, который принимает примитив float и возвращает объект float как таковой:

+ (NSNumber *)numberWithFloat:(float)value

поэтому вы можете заполнить ваш массив следующим образом:

float exampleFloat = 5.4;

NSArray *anArrayOfFloatObjects = [NSArray arrayWithObjects:
                                    [NSNumber numberWithFloat:10.0],
                                    [NSNumber numberWithFloat:2],
                                    [NSNumber numberWithFloat:4],
                                    [NSNumber numberWithFloat:exampleFloat],
                                    nil]; // Don't forget the nil to signal
                                          // end of the array

Что касается вашей конкретной проблемы, вы можете написать:

NSMutableArray *tmpArray; // this is necessary since an NSArray can only be initialized 
                          // once and we will need to have all the objects that will be 
                          // added to the array available to us at once.

tmpArray = [NSMutableArray arrayWithCapacity:12]; // returns an autoreleased empty array


for (int col=0; col<=3; col++) {
    for (int row=0; row<=2; row++) {
        [tmpArray addObject:[NSNumber numberWithFloat:array[col][row]]];
    }
}
NSArray *myArray = [NSArray arrayWithArray:tmpArray];

Что касается использования словаря для извлечения значений матрицы, я могу думать только о том, чтобы кодировать значения матрицы как ключ:

А1 А2 А3 А4

B1 B2 B3 B4

C1 C2 C3 C4

D1 D2 D3 D4

например:

 NSMutableDictionary *myDictionary;

[myDictionary setObject:[NSNumber numberWithFloat:5.0] forKey:@"A1"];

...

NSNumber *myFloat = [myDictionary objectForKey:@"A1"];

Также важно отметить, что всякий раз, когда что-то записывается в формате @ «что-то здесь», оно буквально является объектом NSString. поэтому, когда вы пишете:

NSArray *objectsForArray = [NSArray arrayWithObjects:
                                             @"array[tempI][tempJ]",
                                             @"array[tempI][tempJ+1]",                                                                                                                                            
                                             @"array[tempI][tempJ+2]",
                                             nil];

это точно так же, как запись:

NSString *newString = @"Roses are red";    // example strings
NSString *newString1 = @"Violets are blue";
NSString *newString2 = @"array[tempI][tempJ+1]";
NSString *newString3 = @"These are all string objects";

NSArray *objectsForArray = [NSArray arrayWithObjects:
                                             @"array[tempI][tempJ]",
                                             newString2,                                                                                                                                          
                                             @"array[tempI][tempJ+2]",
                                             nil];
0 голосов
/ 06 апреля 2010

Попробуйте:

for ( int tempI = 0; tempI < 10; tempI++ )  
{
    int tempJ = 1;
    fl_tempI = float(tempI);
    NSArray *objectsForArray = [NSArray arrayWithObjects:@"array[fl_tempI][tempJ]", @"array[fl_tempI][tempJ+1]",  @"array[fl_tempI][tempJ+2]", nil];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...