單例在iOS日常開發中是一個很常用的模式。對於希望在 app 的生命周期中只應該存在一個的對象,保證對象的唯一性的時候,一般都會使用單例來實現功能。在OC單例的寫法如下:
@implementation Singleton + (id)sharedInstance { static Singleton *staticInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ staticInstance = [[self alloc] init]; }); return staticInstance; } @end
那么在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當然有更簡潔的寫法:
結構體寫法:
class Singleton { class var sharedInstance: Singleton { struct Static { static let instance = Singleton() } return Static.instance } }
這種寫法是在Swift1.0版本的時候,必須的寫法,因為Swift1.0,類還不支持全局類變量。而結構體卻支持。
還有其他的寫法
喵神推薦的寫法是:
private let sharedInstance = MyManager() class MyManager { class var sharedManager : MyManager { return sharedInstance } }
還有沒有更簡單的寫法?有,下面一種:
class Singleton { static let sharedInstance = Singleton() private init() {} // 阻止其他對象使用這個類的默認的'()'初始化方法 }
畢竟Swift2.0剛出來不久,沒有像OC一樣,基本上全世界的開發者都是一個寫法,很多東西都要互相借鑒探討。感謝共享知識的所有人,感謝Google。
以上內容參考文章鏈接為:swifter.tips ,swift308 ,stackoverflow