3 回答
TA貢獻1900條經驗 獲得超5個贊
TL;DR:使用類常數如果您正在使用SWIFT1.2或更高版本,并且嵌套結構如果需要支持早期版本,請使用此方法。
根據我使用SWIFT的經驗,有三種方法可以實現Singleton模式,它們支持延遲初始化和線程安全。
類常數
class?Singleton??{
???static?let?sharedInstance?=?Singleton()}此方法支持延遲初始化,因為Swift延遲初始化類常量(和變量),并且通過let..
SWIFT 1.2中引入了類常數。如果需要支持SWIFT的早期版本,請使用下面的嵌套結構方法或全局常量。
嵌套結構
class?Singleton?{
????class?var?sharedInstance:?Singleton?{
????????struct?Static?{
????????????static?let?instance:?Singleton?=?Singleton()
????????}
????????return?Static.instance????}}這里我們使用嵌套結構的靜態常數作為類常量。這是SWIFT1.1及更早版本中缺少靜態類常量的一種解決方法,并且仍然可以解決函數中缺少靜態常量和變量的問題。
派遣一次
傳統的目標-C方法移植到SWIFT。我相當肯定,與嵌套的struct方法相比沒有什么優勢,但我還是把它放在這里,因為我發現語法上的差異很有趣。
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!
????}}TA貢獻1155條經驗 獲得超0個贊
由于Apple現在已經澄清靜態struct變量被初始化為延遲并被包裝在調度_ONE中(請參閱文章末尾的注釋),我認為我的最后解決方案將是:
class?WithSingleton?{
????class?var?sharedInstance?:WithSingleton?{
????????struct?Singleton?{
????????????static?let?instance?=?WithSingleton()
????????}
????????return?Singleton.instance????}}這利用了靜態結構元素的自動延遲、線程安全初始化,向使用者安全地隱藏了實際實現,使所有內容保持緊湊的可讀性,并消除了一個可見的全局變量。
蘋果已經澄清,延遲初始化程序是線程安全的,因此不需要dispatch_once或類似的保護
全局變量的延遲初始化器(也適用于結構和枚舉的靜態成員)將在第一次訪問全局變量時運行,并以調度_ONE的形式啟動,以確保初始化是原子的。這使得在代碼中使用調度一次的方法很酷:只需使用初始化器聲明一個全局變量,并將其標記為私有變量即可。
- 3 回答
- 0 關注
- 713 瀏覽
添加回答
舉報
