單例在iOS平常開發中是一個很經常使用的模式。對於但願在 app 的生命週期中只應該存在一個的對象,保證對象的惟一性的時候,通常都會使用單例來實現功能。在OC單例的寫法以下:html
@implementation Singleton + (id)sharedInstance { static Singleton *staticInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ staticInstance = [[self alloc] init]; }); return staticInstance; } @end
那麼在swift中,咱們怎麼寫單例呢。首先,單例必須是惟一的,在一個應用程序的生命週期裏,有且只有一個實例存在。爲了保持一個單例的惟一性,單例的構造器必須是私有的。這防止其餘對象也能建立出單例類的實例。爲了確保單例在應用程序的整個生命週期是惟一的,它還必須是線程安全的。swift
那麼,根據OC的寫法,改編一下成爲Swift的單例應該這樣寫: 安全
class Singleton { class var sharedInstance : Singleton { struct Static { static var onceToken : dispatch_once_t = 0 static var instance : Singleton? = nil } dispatch_once(&Static.onceToken) { Static.instance = Singleton() } return Static.instance! } }
這種寫法固然沒有錯,可是Swift固然有更簡潔的寫法:app
結構體寫法:spa
class Singleton { class var sharedInstance: Singleton { struct Static { static let instance = Singleton() } return Static.instance } }
這種寫法是在Swift1.0版本的時候,必須的寫法,由於Swift1.0,類還不支持全局類變量。而結構體卻支持。線程
還有其餘的寫法htm
喵神推薦的寫法是:對象
private let sharedInstance = MyManager() class MyManager { class var sharedManager : MyManager { return sharedInstance } }
點擊打開連接blog
還有沒有更簡單的寫法?有,下面一種:生命週期
class Singleton { static let sharedInstance = Singleton() private init() {} // 阻止其餘對象使用這個類的默認的'()'初始化方法 }
畢竟Swift2.0剛出來不久,沒有像OC同樣,基本上全世界的開發者都是一個寫法,不少東西都要互相借鑑探討。感謝共享知識的全部人,感謝Google。
以上內容參考文章連接爲:swifter.tips ,swift308 ,stackoverflow