NSArray строк с заглавной буквы?

У меня есть NSarray с именем array. И это выглядит так

array = @[@"one", @"two", @"three"];

Я хочу, чтобы этот массив был заглавным. Каков наилучший способ сделать это. Я могу думать только о создании NSMutableArray с именем mutableArray.

И сделать что-то вроде этого

for(int i = 0; i < array.lenght; i++) {
    self.mutableArray = addObject:[array[i] capitalizedString];
}

Или есть другой лучший способ?


person iqueqiorio    schedule 28.10.2014    source источник


Ответы (5)


Волшебный метод, который вы ищете, действительно существует.

NSArray *array = @[@"one", @"two", @"three"];
NSArray *capArray = [array valueForKeyPath:@"capitalizedString"];
person Krys Jurgowski    schedule 28.10.2014
comment
Если кто-то хочет ЗАГЛАВНЫМИ буквами, используйте "uppercaseString" вместо "capitalizedString". - person Ganpat; 09.07.2018

СВИФТ

Вы можете использовать карту

let array = ["one", "two", "three"]
let upercaseArray = array.map({$0.uppercased()})

теперь у вас есть upercaseArray, например ["ONE","TWO","THREE""]

person jagdeep singh    schedule 12.08.2019

Что вам действительно нужно, так это своего рода метод transform, который принимает массив и селектор, а затем возвращает массив результатов применения этого селектора к каждому объекту. К сожалению, в ванильном Objective-C этого нет.

Ваш подход в целом хорош, но я был бы осторожен с двумя моментами. Во-первых, убедитесь, что вы создаете NSMutableArray с емкостью копируемого NSArray, так как это позволит избежать накладных расходов на перераспределение при добавлении в него объектов. Во-вторых, вы можете захотеть copy изменить изменяемый массив, чтобы получить неизменяемый NSArray в качестве конечного результата.

Поэтому я бы использовал что-то вроде этого:

- (NSArray *)capitalizeStringArray:(NSArray *)array {
    // Initialize tempArray with size of array
    NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:array.count];
    for (NSString *str in array) {
        [tempArray addObject:[str capitalizedString]];
    }
    return [tempArray copy]; // convert back to NSArray]
}

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

person Alex MDC    schedule 28.10.2014

Есть около gazillion способов справиться с этим. Для небольших массивов выберите то, что вам легче понять.

Я бы, вероятно, использовал такой код:

- (NSMutableArray *) capitalizedArrayFromArrayOfStrings: (NSArray*) array;
{
  NSMutableArray *result = [NSMutableArray arrayWithCapacity: array.count];
  for (NSString *string in array)
  {
    if ([string isKindOfClass: [NSString class]]
      [result addObject: [string capitalizedString];
  }
}

Создание вашего массива с правильной емкостью в начале позволяет массиву выделить достаточно места для всех его будущих элементов и избавляет его от необходимости выделять больше места позже.

Использование синтаксиса быстрого перечисления for..in более эффективно, чем использование индексации массива, но для коротких массивов разница невелика. Код также проще писать и читать, поэтому я предпочитаю такой синтаксис там, где это возможно.

Как говорит Алекс, вы также можете создать метод категории в NSArray, который будет возвращать версию вашего массива с заглавной буквы, или даже категорию в NSMutableArray, которая заменит строки в массиве «на месте».

person Duncan C    schedule 28.10.2014

Работает как шарм.

NSString *myString = YOUR_ARRAY.uppercaseString;
[myNSMutableArray addObject:myString];
person Nagarjun    schedule 24.10.2016
comment
В ОП четко указано, что они ищут решение для манипулирования уже существующим массивом из нескольких строк в массив каждой строки с заглавной буквы... сори - person Will Von Ullrich; 19.01.2018