Статьи

Весело с YOLOKit

Перечисление коллекций в Objective-C часто многословно и неуклюже. Если вы привыкли к Ruby или работали с Underscore или Lo-Dash в JavaScript, то вы знаете, что есть более элегантные решения. Это именно то, что думали создатели YOLOKit, создавая эту изящную библиотеку. Слоган YOLOKit — Enumerate Foundation восхитительно, и они имеют в виду это.

Добавить YOLOKit в проект Xcode очень легко с CocoaPods. Включите модуль pod в Podfile вашего проекта, запустите pod update из командной строки и импортируйте YOLO.h везде, где вы хотите использовать YOLOKit.

Если вы не используете CocoaPods, загрузите библиотеку с GitHub, добавьте соответствующие файлы в свой проект и импортируйте заголовок 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);

Одним из преимуществ использования 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?»
)

Из-за странного синтаксиса YOLOKit, Xcode не очень поможет, когда дело доходит до завершения кода. Он покажет вам список предложений для методов YOLOKit, но это все. Если вы хотите использовать YOLOKit, вы должны изучить синтаксис.

YOLOKit не оптимизирован для производительности, как показывает эта проблема GitHub . Тем не менее, он делает ваш код красивее и читабельнее. Использование цикла for для цикла над массивом будет быстрее и более производительным, чем методы YOLOKit, и важно помнить об этом.

Я рекомендую YOLOKit? Да и нет. Приведенные выше соображения не должны мешать вам использовать YOLOKit, но убедитесь, что вы не используете YOLOKit, если важна производительность, потому что есть лучшие варианты — например, хороший цикл for .

Суть в том, что вы должны использовать YOLOKit только в том случае, если считаете, что это повышает ценность вашего проекта. Также учтите, что ваши коллеги должны изучить и оценить синтаксис YOLOKit. Я думаю, что YOLOKit — отличный проект, который ясно показывает, насколько невероятно выразительным может быть Objective-C. Для меня это самый важный урок, который я извлекаю из YOLOKit.