3 回答

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