Advertisement

Having Fun with YOLOKit

by

Enumerating collections in Objective-C is often verbose and clunky. If you're used to Ruby or worked with Underscore or Lo-Dash in JavaScript, then you know there're more elegant solutions. That is exactly what the creators of YOLOKit thought when they created this nifty library. YOLOKit's tagline is Enumerate Foundation delightfully and they mean it.

1. Installation

Adding YOLOKit to an Xcode project is very easy with CocoaPods. Include the pod in your project's Podfile, run pod update from the command line, and import YOLO.h wherever you want to use YOLOKit.

If you're not using CocoaPods, then download the library from GitHub, add the relevant files to your project, and import YOLOKit's header.

2. Using YOLOKit

YOLOKit has a lot to offer, but in this quick tip I'll only focus on a few of the methods YOLOKit has in its repertoire.

Minimum and Maximum

Let's start simple with extracting the minimum and maximum value of an array. Take a look at the following code snippet to see how it works.

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);

The above code snippet results in the following output.

MIN -12
MAX 384

The syntax may seem odd and you may be wondering why min and max take a block, but this actually adds more power to theses methods. You can do whatever you like in the block to determine what the minimum and maximum value of the array is. The following example should clarify this.

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);

This code snippet results in the following output.

SHORTEST a
LONGEST  everyone

YOLOKit is flexible and doesn't complain about the type of the block arguments. However, to satisfy the compiler, we cast the return value of the block to NSInteger, because that's what it expects.

Filtering Arrays

Selecting & Rejecting

There are a number of methods to filter arrays, including select and reject. Let's see how we can filter the array of numbers and words we created earlier.

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);

You have to admit that this is very nice to look at. It's concise and very legible. The arrays in the above examples are simple, but note that you can use arrays that are much more complex than this. The following example illustrates this.

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;
});

Subarrays

YOLOKit also defines first and last, but they don't do what you expect them to do. In other words, they're not equivalent to NSArray's firstObject and lastObject methods. With first and last you can create a subarray from the original array. Take a look at the following example.

NSArray *subsetNumbers = numbers.first(3);
NSArray *subsetWords = words.last(2);
    
NSLog(@"SUBSET NUMBERS\n%@", subsetNumbers);
NSLog(@"SUBSET WORDS\n%@", subsetWords);

The above code snippet results in the following output.

SUBSET NUMBERS
(
    1,
    2,
    45
)
SUBSET WORDS
(
    for,
    everyone
)

Manipulating Arrays

Sorting

Sorting an array is trivial with YOLOKit. Let's see what it takes to sort the array of numbers we created earlier. It's that easy.

NSArray *sortedNumbers = numbers.sort;
    
NSLog(@"%@", sortedNumbers);

Uniquing

One of the benefits of using NSSet is that it doesn't contain duplicate objects. However, uniquing an array of objects is trivial with YOLOKit. Let's add a few additional numbers with YOLOKit's concat method and then unique the array with uniq.

// Concatenate
numbers = numbers.concat(@[@1, @2, @3, @4]);

NSLog(@"CONCAT %@", numbers);

// Unique & Sort
numbers = numbers.uniq.sort;

NSLog(@"UNIQ %@", numbers);

Have you noticed I also sorted the array by chaining uniq and sort? The goal isn't to turn Objective-C code into Ruby or JavaScript, but I'm sure you agree that this code snippet is concise, and very easy to read and understand.

Reversing & Shuffling

// Reversing
NSArray *reversedNumbers = numbers.reverse;
    
// Shuffling
NSArray *shuffledWords = words.shuffle;
    
NSLog(@"REVERSED\n%@", reversedNumbers);
NSLog(@"SHUFFLED\n%@", shuffledWords);

The above code snippet results in the following output.

REVERSED
(
    384,
    "3.14",
    "-12",
    45,
    2,
    1
)
SHUFFLED
(
    for,
    is,
    everyone,
    example,
    a,
    this
)

Other Methods

There are a lot of other methods to work with arrays, such as rotate, sample, without, set, transpose, etc. I encourage you to browse YOLOKit on GitHub to find out more about them.

There are also methods that can be used with NSDictionary, NSNumber, and NSString. The following code snippet shows you how to convert a string into an array of words.

id wordsInString = @"You only live once. Right?".split(@" ");

NSLog(@"STRING %@", wordsInString);
STRING (
    You,
    only,
    live,
    "once.",
    "Right?"
)

3. Considerations

Code Completion

Because of YOLOKit's odd syntax, Xcode won't be of much help when it comes to code completion. It will show you a list of suggestions for YOLOKit's methods, but that's about it. If you want to use YOLOKit, you'll have learn the syntax.

Performance

YOLOKit isn't optimized for performance as this GitHub issue shows. However, it does make your code prettier and more readable. Using a for loop to loop over an array will be faster and more performant than YOLOKit's methods and it's important that you keep this in mind.

Conclusion

Do I recommend YOLOKit? Yes and no. The above considerations shouldn't keep you from using YOLOKit, but make sure that you don't use YOLOKit if performance is important, because there are better options available—like the good ol' for loop.

The long of the short is that you should only use YOLOKit if you feel that it adds value to your project. Also consider that your colleagues need to learn and appreciate YOLOKit's syntax. I think YOLOKit is a great project that clearly shows how incredibly expressive Objective-C can be. For me, that's the most important lesson I take away from YOLOKit.

Advertisement