《Advanced Swift》笔记1:数组变形(一) —— map 和 flatMap | LiJun's Blog 

作者:JerryXia | 发表于 , 阅读 (0)
map和flatMap是Swift数组中的两个高阶函数,他们能很方便的对数组内的所有元素进行操作,然后返回一个新的数组。本文将探索这两个函数的实际使用以及其内部实现。
map在objective-c中,如果我们要对一个数组里的每个元素进行操作,我们都是通过写for循环来遍历数组,然后在再对元素进行操作。比如我们要对一个数组中的所以元素做平方,并返回新的数组,我们可以这样写:
1234567891011121314151617    NSArray *array = @[@(1), @(3), @(5), @(6)];    NSMutableArray *sauared = [NSMutableArray array];    for (NSNumber *number in array) {      NSInteger num = number.integerValue;      [sauared addObject:@(num * num)];    }    NSLog(@"%@", sauared);        // 最后的输出为:    2016-07-31 15...阅读全文

 《Advanced Swift》笔记4:切片(Slice) | LiJun's Blog 

作者:JerryXia | 发表于 , 阅读 (0)
切片(Slice)是基于任何集合类型(遵守CollectionType的类型)的轻量级封装,默认的实现是返回了一个对原来集合的封装,再加上一个索引的子范围,所以它的内存大小会比原来更大。而且包括Swift的数组和字符串在内的很多可切片的容器,切片和原集合共享存储缓存,这会导致即使原集合离开了作用域,切片依然会持有原集合的缓存,这可能会导致内存问题。
With many sliceable containers, including Swift’s arrays and strings, a slice shares the storage buffer of the original collection. This has an unpleasant side effect: slices can keep the original collection’s buffer alive in its entirety, even if the original collection falls out of scope. If you read a 1 GB file into an...阅读全文

 《Advanced Swift》笔记2:数组变形(二)—— filter 和 reduce | LiJun's Blog 

作者:JerryXia | 发表于 , 阅读 (0)
本文将介绍filter和reduce两个高阶函数的使用和内部实现。
filterfilter方法可以过滤掉数组中不符合条件的元素,返回包含所有符合条件的元素的数组。比如现在需要选出一个数组中所有的偶数,传统的做法是这样的
12345678let numbers = [1, 2, 3, 4, 5]var evens = [Int]()for num in numbers {  if num % 2 == 0 {    evens.append(num)  }}print(evens)  // [2,4]和map方法一样,filter也是讲for循环中的代码块用闭包封装了,我们只需要在闭包中传入筛选条件即可:
123let numbers = [1, 2, 3, 4, 5]let evens = numbers.filter{$0 % 2 == 0}print(evens)  // [2,4]使用filter方法的优点和map方法一样,代码简洁、语义清晰、更安全。
filter的内部实现和map差不多,就是在像新数组添加元素时增加了一个条件判断。可以这样实现它:
12345678...阅读全文

 《Advanced Swift》笔记3:如何自己实现一个Swift数组 | LiJun's Blog 

作者:JerryXia | 发表于 , 阅读 (0)
本文中,我们将会探索Swift原生Array数组的实现方式,并且自定义实现一个数组类型,能够字面量来创建数组,通过下标来获取元素。
通过查看文档我们发现,Swift的数组是一个结构体类型,它遵守了CollectionType、MutableCollectionType、_DstructorSafeContainer协议,其中最重要的就是CollectionType协议,数组的一些主要功能都是通过这个协议实现的。而CollectionType协议又遵守Indexable和SequenceType这两个协议。而在这两个协议中,SequenceType协议是数组、字典等集合类型最重要的协议,在文档中解释了SequenceType是一个可以通过for…in循环迭代的类型,实现了这个协议,就可以for…in循环了。
A type that can be iterated with a for…in loop.
而SequenceType是建立在GeneratorType基础上的,sequence需要GeneratorType来告诉它如何生成元素。
GeneratorTypeGenerat...阅读全文

 Swift3.0的访问控制 | LiJun's Blog 

作者:JerryXia | 发表于 , 阅读 (0)
在Swift3.0之前,访问控制分为三种:public、internal、private。而在Swift3.0,实际上有5种。
Open, 最高访问控制,通过引入这个模块,外部文件就能使用它,并且可以继承和覆盖重写。Public, 次高访问控制,通过引入这个模块,外部文件就能使用它,但不能继承和覆盖重写。Internal, 模块内部任何文件可以访问。File-private, 文件内部才能访问。Private, 代码作用域内才能访问。默认的访问控制类型是Internal。
...阅读全文