Перечисление коллекций в Objective-C часто многословно и неуклюже. Если вы привыкли к Ruby или работали с Underscore или Lo-Dash в JavaScript, то вы знаете, что есть более элегантные решения. Это именно то, что думали создатели YOLOKit, создавая эту изящную библиотеку. Слоган YOLOKit — Enumerate Foundation восхитительно, и они имеют в виду это.
1. Установка
Добавить YOLOKit в проект Xcode очень легко с CocoaPods. Включите модуль pod в Podfile вашего проекта, запустите pod update
из командной строки и импортируйте YOLO.h
везде, где вы хотите использовать YOLOKit.
Если вы не используете CocoaPods, загрузите библиотеку с GitHub, добавьте соответствующие файлы в свой проект и импортируйте заголовок YOLOKit.
2. Использование YOLOKit
YOLOKit может многое предложить, но в этом кратком совете я остановлюсь только на нескольких методах, которые YOLOKit использует в своем репертуаре.
Минимум и максимум
Давайте начнем с простого извлечения минимального и максимального значения массива. Взгляните на следующий фрагмент кода, чтобы увидеть, как он работает.
01
02
03
04
05
06
07
08
09
10
11
12
|
NSArray *numbers = @[ @(1), @(2), @(45), @(-12), @(3.14), @(384) ];
// Minimum
id min = numbers.min(^(NSNumber *n) {
return n.intValue;
});
id max = numbers.max(^(NSNumber *n) {
return n.intValue;
});
NSLog(@»\nMIN %@\nMAX %@», min, max);
|
Приведенный выше фрагмент кода приводит к следующему выводу.
1
2
|
MIN -12
MAX 384
|
Синтаксис может показаться странным, и вам может быть интересно, почему min
и max
берут блок, но на самом деле это добавляет больше силы этим методам. Вы можете делать все что угодно в блоке, чтобы определить минимальное и максимальное значение массива. Следующий пример должен прояснить это.
01
02
03
04
05
06
07
08
09
10
11
12
|
NSArray *words = @[ @»this», @»is», @»a», @»example», @»for», @»everyone» ];
// Minimum
id shortest = words.min(^(NSString *n) {
return (NSInteger)n.length;
});
id longest = words.max(^(NSString *n) {
return (NSInteger)n.length;
});
NSLog(@»\nSHORTEST %@\nLONGEST %@», shortest, longest);
|
Этот фрагмент кода приводит к следующему выводу.
1
2
|
SHORTEST a
LONGEST everyone
|
YOLOKit является гибким и не жалуется на тип аргументов блока. Однако, чтобы удовлетворить компилятор, мы приводим возвращаемое значение блока к NSInteger
, потому что это то, что он ожидает.
Фильтрация массивов
Выбор и отклонение
Существует несколько способов фильтрации массивов, включая select
и reject
. Давайте посмотрим, как мы можем отфильтровать массив чисел и слов, которые мы создали ранее.
01
02
03
04
05
06
07
08
09
10
11
|
NSArray *filteredNumbers = numbers.select(^(NSNumber *n) {
return n.intValue > 10;
});
NSLog(@»FILTERED NUMBERS\n%@», filteredNumbers);
NSArray *filteredWords = words.reject(^(NSString *n) {
return n.length <= 2;
});
NSLog(@»FILTERED WORDS\n%@», filteredWords);
|
Вы должны признать, что это очень приятно смотреть. Это сжато и очень разборчиво. Массивы в приведенных выше примерах просты, но обратите внимание, что вы можете использовать массивы, которые намного сложнее, чем эта. Следующий пример иллюстрирует это.
1
2
3
4
5
6
7
8
9
|
NSArray *people = @[ person1, person2, person3, person4, person5, person6 ];
NSArray *males = people.select(^(Person *p) {
return p.sex == 0;
});
NSArray *females = people.reject(^(Person *p) {
return p.sex == 0;
});
|
Подмассивы
YOLOKit также определяет first
и last
, но они не делают то, что вы ожидаете от них. Другими словами, они не эквивалентны NSArray
firstObject
и lastObject
. С first
и last
вы можете создать подмассив из исходного массива. Посмотрите на следующий пример.
1
2
3
4
5
|
NSArray *subsetNumbers = numbers.first(3);
NSArray *subsetWords = words.last(2);
NSLog(@»SUBSET NUMBERS\n%@», subsetNumbers);
NSLog(@»SUBSET WORDS\n%@», subsetWords);
|
Приведенный выше фрагмент кода приводит к следующему выводу.
01
02
03
04
05
06
07
08
09
10
11
|
SUBSET NUMBERS
(
1,
2,
45
)
SUBSET WORDS
(
for,
everyone
)
|
Манипулирующие массивы
Сортировка
Сортировка массива тривиальна с YOLOKit. Давайте посмотрим, что нужно для сортировки массива чисел, который мы создали ранее. Это так просто.
1
2
3
|
NSArray *sortedNumbers = numbers.sort;
NSLog(@»%@», sortedNumbers);
|
Uniquing
Одним из преимуществ использования NSSet
является то, что он не содержит повторяющихся объектов. Тем не менее, создание уникального массива объектов тривиально с YOLOKit. Давайте добавим несколько дополнительных чисел с помощью метода concat от YOLOKit, а затем уникальные массивы с помощью uniq
.
1
2
3
4
5
6
7
8
9
|
// Concatenate
numbers = numbers.concat(@[@1, @2, @3, @4]);
NSLog(@»CONCAT %@», numbers);
// Unique & Sort
numbers = numbers.uniq.sort;
NSLog(@»UNIQ %@», numbers);
|
Вы заметили, что я также отсортировал массив по цепочке uniq
и sort
? Цель состоит не в том, чтобы превратить код Objective-C в Ruby или JavaScript, но я уверен, что вы согласны с тем, что этот фрагмент кода является кратким, и его очень легко прочитать и понять.
Реверс и перетасовка
1
2
3
4
5
6
7
8
|
// Reversing
NSArray *reversedNumbers = numbers.reverse;
// Shuffling
NSArray *shuffledWords = words.shuffle;
NSLog(@»REVERSED\n%@», reversedNumbers);
NSLog(@»SHUFFLED\n%@», shuffledWords);
|
Приведенный выше фрагмент кода приводит к следующему выводу.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
REVERSED
(
384,
«3.14»,
«-12»,
45,
2,
1
)
SHUFFLED
(
for,
is,
everyone,
example,
a,
this
)
|
Другие Методы
Есть много других методов для работы с массивами, таких как rotate
, sample
, without
, set
, transpose
и т. Д. Я рекомендую вам просмотреть YOLOKit на GitHub, чтобы узнать о них больше.
Есть также методы, которые можно использовать с NSDictionary
, NSNumber
и NSString
. В следующем фрагменте кода показано, как преобразовать строку в массив слов.
1
2
3
|
id wordsInString = @»You only live once. Right?».split(@» «);
NSLog(@»STRING %@», wordsInString);
|
1
2
3
4
5
6
7
|
STRING (
You,
only,
live,
«once.»,
«Right?»
)
|
3. Соображения
Завершение кода
Из-за странного синтаксиса YOLOKit, Xcode не очень поможет, когда дело доходит до завершения кода. Он покажет вам список предложений для методов YOLOKit, но это все. Если вы хотите использовать YOLOKit, вы должны изучить синтаксис.
Производительность
YOLOKit не оптимизирован для производительности, как показывает эта проблема GitHub . Тем не менее, он делает ваш код красивее и читабельнее. Использование цикла for
для цикла над массивом будет быстрее и более производительным, чем методы YOLOKit, и важно помнить об этом.
Вывод
Я рекомендую YOLOKit? Да и нет. Приведенные выше соображения не должны мешать вам использовать YOLOKit, но убедитесь, что вы не используете YOLOKit, если важна производительность, потому что есть лучшие варианты — например, хороший цикл for
.
Суть в том, что вы должны использовать YOLOKit только в том случае, если считаете, что это повышает ценность вашего проекта. Также учтите, что ваши коллеги должны изучить и оценить синтаксис YOLOKit. Я думаю, что YOLOKit — отличный проект, который ясно показывает, насколько невероятно выразительным может быть Objective-C. Для меня это самый важный урок, который я извлекаю из YOLOKit.