今天跑到大学里来看源码,刚开学就有好多同学上自习,好久没来过大学了,还是大学里安静。
今天看了一点Alamofire的源码,其中Manager的单例如下:
public static let sharedInstance: Manager = { let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders return Manager(configuration: configuration) }()
上面的代码中使用public static let 定义了单例变量sharedInstance。看到这个单例我首先想到的是这样写然后将init方法设置成private的,就能够实现单例了。但是看了一下源码,源码中的init方法竟然是public的,后来自己给解释了一下,可能是作者给用户留了创建自己实例的入口。但是想想这样有点违背单例的思想了。
补充一点,在OC中创建单例一般如下:
+ (AccountManager *)sharedManager { static AccountManager *sharedAccountManagerInstance = nil; static dispatch_once_t predicate; dispatch_once(&predicate, ^{ sharedAccountManagerInstance = [[self alloc] init]; }); return sharedAccountManagerInstance; }
网上还有判断sharedAccountManagerInstance是否为空,然后创建的,但是这种方式创建的单例,在多线程的情况下,容易出现问题。具体问题可以百度。
下面想说的是对于类型方法及属性的修饰符:static和class关键字。首先列出来一篇文章,看完了这篇文章之后再回来看我写的后面。这篇文章是王巍写的,质量挺高的,地址:http://swifter.tips/static-class/。
在王巍的文章中详细的介绍了static和class的使用情况。简单的概括就是struct、enum中使用static,class中存储属性使用static、计算属性和方法使用class。我自己做测试了在class中计算属性和方法使用也可以使用static,所以如果不好记,直接都使用static也可以。
转过来看一下上面Alamofire代码中的共享实例的声明,第一次看到我以为是一个计算属性,因为后面跟着好多代码。但是仔细一看,其实是一个存储属性,在等于号后面其实是一个尾随闭包,然后使用括号,马上获得了闭包返回的值,然后赋值给了该存储属性。(对于这个可能说法不对,我原来看过这种情况叫什么,可能记错了,如果错了麻烦给我指出)。
下面是广告:
本人分享到github上整理的swift 2.0的playground。地址https://github.com/mengxiangyue/The-Swift-2.0-Programming-Language-playground
对应最新发布《The Swift Programming Language》Swift 2.0 版本一书中内容。这些Playground基本是书中知识点的一个总结,如果不想看英文书的人看这些Palyground都看完了,也基本算是看完了书中的内容。
版权声明:本文为博主原创文章,未经博主允许不得转载。