Расширяемые коллекции в Objective-C? - PullRequest
1 голос
/ 04 марта 2010

Я проверял этот вопрос , который имеет этот код

- (NSArray *) percentagesRGBArray:(float[]) rgbArray
{
    NSNumber *red = [NSNumber numberWithFloat:rgbArray[0] / 255];
    NSNumber *green = [NSNumber numberWithFloat:rgbArray[1] / 255];
    NSNumber *blue = [NSNumber numberWithFloat:rgbArray[2] / 255];
    NSNumber *alpha = [NSNumber numberWithFloat:rgbArray[3]];
    return [NSArray arrayWithObjects:red, green, blue, alpha, nil];
}

, и я подумал: "Это ужасно, что если у вас больше трех цветов?"Я знаю, вы не знаете, но что, если у вас были цвета count-1 и альфа? Допустим, у вас было [rgbArray count] (подсчет даже работает для реального массива?) Использование только объективногоC, как обычно вы возвращали бы NSArray из n объектов?

Я просто пытался разобраться с этим, но у меня все еще нет возможности сделать это в target-C.Вот моя неудачная попытка:

- (NSArray *) what:(float[]) rgbArray
{
    int len = sizeof(rgbArray)/sizeof(float); // made up syntax
    NSLog(@"length is wrong dummy %d", len);
    NSNumber *retVal[len];
    for (int i=0;i<(len-1);i++) {
        NSNumber *red = [NSNumber numberWithFloat:rgbArray[0] / 255];
        retVal[i] = red;
        [red release];
    }
    retVal[len-1] = [NSNumber numberWithFloat:rgbArray[len-1]];
    return [NSArray arrayWithObjects:retVal count:len];

}

Ответы [ 2 ]

5 голосов
/ 04 марта 2010

Вы можете использовать NSMutableArray.

Вы можете добавлять и удалять элементы из него, и это подкласс NSArray, поэтому его можно передавать любому методу, ожидающему NSArray.

1 голос
/ 04 марта 2010

Ну, так же, как arrayWithObjects:count: имеет count: часть, вы можете сделать

- (NSArray *) what:(float[]) rgbArray count:(int)len
{
    NSMutableArray*result=[NSMutableArray array];
    for (int i=0;i<len;i++) {
        NSNumber *red = [NSNumber numberWithFloat:rgbArray[0] / 255];
        [result addObject:red];
    }
    return result;
}

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

- (NSArray *) what:(float[]) rgbArray count:(int)len
{
    NSNumber**retVal=malloc(len*sizeof(NSNumber*));
    for (int i=0;i<len;i++) {
        NSNumber *red = [NSNumber numberWithFloat:rgbArray[0] / 255];
        retVal[i]=red;
    }
    NSArray*result=[NSArray arrayWithObjects:retVal count:len];
    free(retVal);
    return result;
}

На данном этапе это не вопрос Objective-C, а вопрос просто C, верно? Ваши вопросы

  1. как динамически выделить массив в C и
  2. как получить размер массива из функции в C.

Ответы

  1. Вы используете malloc.
  2. Вы не можете этого сделать, поэтому вам нужно передать это функции.

Вот и все. Итак, если у вас есть вопрос о том, как обращаться с массивами C, вы должны спросить экспертов по C ... в Objective-C нет ничего особенного, кроме синтаксиса объявления метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...