Как вы присоединяете NSArray [Number numberWithChar: c] к NSString? - PullRequest
1 голос
/ 13 октября 2011

Когда я использую componentsJoinedByString, я просто получаю длинную строку цифр.

Редактировать: я понимаю, что это задание сбивает с толку. Зачем кому-то заполнять NSArray NSNumbers, если они хотят NSString? Ответ в том, что я пишу расширяемый фреймворк для модульных тестов. Основные функции genNum, genBool и genChar генерируют NSNumbers со случайными значениями int, BOOL и char соответственно. Тогда есть genArray, который генерирует случайный массив, используя указанный генератор. Таким образом, чтобы создать случайную строку NSString, нужно запустить genArray с использованием генератора genChar и преобразовать полученный массив NSArray в строку NSString.

Символы сохраняются только как NSNumber с вместо char с из-за технической сложности: genArray принимает блок и вызывает блок 100 с лишним раз, чтобы заполнить NSArray. Блоки должны содержать объекты ObjC; не примитивные типы.

Таким образом, остается вопрос: как присоединить NSArray [NSNumber numberWithChar: c] к NSString?

Ответы [ 4 ]

2 голосов
/ 13 октября 2011

componentsJoinedByString объединяет элементы массива в строку с символом разделителя между ними. Элементы массива преобразуются в строки (если это еще не NSString "с использованием метода description. Если у вас есть массив n NSNumbers, я бы ожидал интересный результат.

1 голос
/ 13 октября 2011
+ (NSString *) genString {
    NSArray* arr = [self genArray: ^() { return [ObjCheck genChar]; }];

    NSMutableString* s = [NSMutableString stringWithCapacity: [arr count]];

    int i;
    for (i = 0; i < [arr count]; i++) {
        [s appendString: [NSString stringWithFormat: @"%c", [[arr objectAtIndex: i] charValue]]];
    }

    return s;
}
1 голос
/ 13 октября 2011

Почему бы не заполнить ваш массив [NSString stringWithCharacters:c length:1]? Тогда componentsJoinedByString: должно работать. (Проверьте документы на stringWithCharacters:length:; выше это только для иллюстрации. Возможно, вам придется использовать, например, &c.)

0 голосов
/ 13 октября 2011
+ (id)genString {
    NSArray *chars = [self genArray:^{ return [ObjCheck genChar]; }];

    if ([chars count] == 0) {
        return @"";
    }

    unichar *buffer = malloc(sizeof(unichar) * [chars count]);

    [chars enumerateObjectsUsingBlock:^(NSNumber *num, NSUInteger idx, BOOL *stop) {
        buffer[idx] = (unichar)[num charValue];
    }];

    return [[[NSString alloc] initWithCharactersNoCopy:buffer length:[chars count] freeWhenDone:YES] autorelease];
}

В этом конкретном решении предполагается, что символы> 127 следует рассматривать как кодовые точки Юникода (что в основном означает для значений размера символа как ISO-8859-1). Это также позволяет избежать копирования буфера при создании результирующей строки.

...