swift中一些超级强大的实用技巧

1.swift中的过滤器(filter函数 && map函数)

情景1:你有一个数组,接着你想创建一个新数组,这组数组包含原数组中大于10的数

let anArray = Array(1...20)

let anotherArray = anArray.filter( { (a:Int)->Bool in

 return a>10

})

很简单吧

该函数带一个闭包作为参数,这个闭包将数组元素作为参数,并返回一个Bool结果。数组中每个元素都会执行该闭包,根据反回结果来决定是否存在于新的数组中

根据闭包的简写,我们还可以简化至

let anotherArray = anArray.filter( {$0 > 10})

print(anotherArray) // 11 ,12,13,14,15,16,17,18,19,20

是不是精简了很多

再来看看map函数

该函数同样是带一个闭包作为参数并且在内部返回一个经过转换的元素。

情景2:我们先刷选出所有大于10的数,然后让它们的值翻一翻

let anArray =Array(1...20)

let anotherArray = anArray.filter({$0 > 10 }).map({ $0 * 2 })

print (anotherArray)//22,24,26,28,30,32,34,36,38,40

更多关于map的细节,参考这里

2.单例

swift中单例只要一行就能表示出来

class XYFHomePageModel: NSObject {

//单例

static let homeModelSingle = XYFHomePageModel()

比较一下oc中的单例

+ (instancetype)sharedInstance {

static Kraken *sharedInstance = nil;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

sharedInstance = [[Kraken alloc] init];

});

return sharedInstance;

}

现在,你可能会有疑问:swift中为何看不到dispatch_once?根据Apple Swift博客中的说法,以上方法都自动满足dispatch_once规则。这里有个帖子可以证明dispatch_once规则一直在起作用。

“全局变量(还有结构体和枚举体的静态成员)的Lazy初始化方法会在其被访问的时候调用一次。类似于调用'dispatch_once'以保证其初始化的原子性。这样就有了一种很酷的'单次调用'方式:只声明一个全局变量和私有的初始化方法即可。”--来自Apple's Swift Blog

(“The lazy initializer for a global variable (also for static members of structs and enums) is run the first time that global is accessed, and is launched as `dispatch_once` to make sure that the initialization is atomic. This enables a cool way to use `dispatch_once` in your code: just declare a global variable with an initializer and mark it private.”)

正确的方法(也即是“单行单例法”)现在已经被证明正确。

class TheOneAndOnlyKraken {

static let sharedInstance = TheOneAndOnlyKraken()

}

未完待续

你可能感兴趣的:(swift中一些超级强大的实用技巧)