tonynju 2014-06-10
1、安装
大家可以利用CocoaPods轻松将YOLOKit添加到Xcode项目当中。只要将该pod加入到开发项目的Podfile,通过命令行运行pod update,然后将YOLO.h导入到我们希望使用YOLOKit的位置即可。
如果大家不打算使用CocoaPods,也可以直接从GitHub中下载这套库,将相关文件添加到项目当中然后导入YOLOKit标头。
2、使用YOLOKit
YOLOKit提供大量实用功能,但出于篇幅考虑,我们将专注于探讨YOLOKit中的一部分办法。
最小与最大
让我们先从简单的问题着手,看看如何从一个数组中提取出最小与最大的数值。请大家阅读以下代码片段来理解它的运作过程。
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);
上述代码片段的执行结果如下所示。
MIN -12 MAX 384
这部分语法看起来可能有点奇怪,大家也许会想为什么要将min与max构成一个block,但事实上这种作法能带来更多强大的功能。大家可以在block中添加任何内容,从而检测该数组中的最小与最大值分别是什么。下面的示例应该足以打消大家的疑惑。
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非常灵活而且不会对block参数的类型作出任何要求。不过为了照顾到编译器的需要,我们需要将block的返回值交给NSInteger。
过滤数组
选择&拒绝
对数组进行过滤的方法有很多,其中包括select与reject。下面让我们一起来看如何对之前创建的数组进行数字与单词过滤。
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);
大家必须要承认,上述代码看起来非常出彩——可以说既简洁又清晰。在前面的例子中,数组内容相比比较简单,但请注意,大家完全可以使用复杂程度远高于此的数组。下面这个例子能够证明这一点。
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的帮助下,大家可以在原始数组当中创建子数组,具体请看以下示例。
NSArray *subsetNumbers = numbers.first(3); NSArray *subsetWords = words.last(2); NSLog(@"SUBSET NUMBERS\n%@", subsetNumbers); NSLog(@"SUBSET WORDS\n%@", subsetWords);
上述代码片段经过执行会得出以下输出结果。
SUBSET NUMBERS ( 1, 2, 45 ) SUBSET WORDS ( for, everyone )
操作数组
数字排序
对数组进行排序在YOLOKit眼中可谓小菜一碟。让我们看看它如何对之前创建的数组进行数字排序。轻松如斯:
NSArray *sortedNumbers = numbers.sort; NSLog(@"%@", sortedNumbers);
独特内容过滤
使用NSSet的好处之一在于它不会包含重复对象。不过对对象数组进行独特内容过滤对YOLOKit同样是轻松愉快。让我们利用YOLOKit的concat方法添加一些额外数字,然后利用uniq对该数组进行独特内容过滤。
// 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形式,但可以肯定大家也感受到了上述代码片段的简洁性以及阅读方面的便利性。
逆向与改组
// Reversing NSArray *reversedNumbers = numbers.reverse; // Shuffling NSArray *shuffledWords = words.shuffle; NSLog(@"REVERSED\n%@", reversedNumbers); NSLog(@"SHUFFLED\n%@", shuffledWords);
以上代码片段执行后的输出结果如下所示。
REVERSED ( 384, "3.14", "-12", 45, 2, 1 ) SHUFFLED ( for, is, everyone, example, a, this )
其它方法
能够用于处理数组的方法还有很多,其中包括rotate、sample、without、set以及transpose等等。我建议大家点击此处查看GitHub网站上的YOLOKit专区以了解更多细节信息。
其中一些方法还能够与NSDictionary、NSNumber以及NSString共同使用。以下代码片段显示的就是我们要如何将字符串转换成单词数组。
id wordsInString = @"You only live once. Right?".split(@" "); NSLog(@"STRING %@", wordsInString);
STRING ( You, only, live, "once.", "Right?" )
3、注意事项
代码完成情况
由于YOLOKit的语法比较怪异,因此Xcode对与之相关的代码完成情况其实帮不上什么大忙。它会为我们提供一份关于YOLOKit的方法建议清单,但也就仅此而已了。如果大家打算使用YOLOKit,必须首先认真学习其语法构成。
性能表现
大家可以在GitHub提供的实例(点击此处)中看到,YOLOKit并没有针对性能表现进行过优化。不过它确实能让我们的代码更漂亮也更具可读性。请大家务必记住,使用for循环对数组进行循环遍历能够带来比YOLOKit方法更快、更理想的性能表现。
总结
那么我是否推荐大家使用YOLOKit呢?既是也不是。前面提到的几点负面因素不应该成为大家拒绝使用YOLOKit的理由,不过请确保在使用YOLOKit之前认真考虑到性能表现的重要性,特别是在有其它更好选择的情况下——例如出色的for循环。
长话短说,大家应该在确保YOLOKit能够为项目带来理想价值的情况下加以使用。此外,我们还需要意识到自己的选择会迫使同事学习并适应YOLOKit的语法习惯。我认为YOLOKit是个了不起的项目,这一点已经在Objective-C实际效果中表现得淋漓尽致。就我个人而言,这也是我从YOLOKit身上学到的最宝贵的财富。
原文链接:
http://code.tutsplus.com/tutorials/having-fun-with-yolokit--cms-21277