在 Swift 中實現單例方法

2021-07-05 03:33:15 字數 1777 閱讀 7866

我們通常在進行開發的時候,會用到乙個叫做 單例模式 的東西。相信大家也都對這種模式非常熟悉了。而且單例的使用在平時的開發中也非常頻繁。 比如我們常用到的nsuserdefaults.standarduserdefaults()

在 swift 中我們如何實現單例模式呢?如果你曾經對 objective-c 比較熟悉的話,你可能首先會想到這樣寫:

class

dbmanager

return instance!

}}

從 objective-c 的思路上來看,這樣好像沒有什麼問題。但在 swift 中,那麼問題就來了。因為 swift 中是不支援靜態成員變數的,所以這行**class var instance: dbmanager?會產生編譯錯誤。

那麼就是說,在 swift 中我們不能通過靜態成員變數的方式實現單例方法了。那麼還有什麼其他的辦法呢。我們還可以將例項變數的定義放到類的外面,比如這樣:

var instance: dbmanager?

class

dbmanager

return instance!

}}

這種方式是可以實現單例的,但會有乙個問題。就是我們可以在任何檔案中訪問到instance這個變數,這樣就很容易造成對這個例項變數的意外操作,並且這也不符合物件導向思想中的封裝特性。

那麼,還有什麼方法呢?

swift 中還有一種屬性叫做 computed 屬性,而這種屬性是可以定義成為靜態型別的。 比如這樣:

class

dbmanager

}

但是這個屬性又有乙個問題,就是它的值每次都需要經過計算生成的,也就是上面**中大括號內的部分。所以它不能單獨作為例項變數存放的地方,它只能夠作為訪問的入口。我們還需要乙個地方來儲存例項變數。

而我們又知道,swift 的類定義中,又不能存在靜態成員變數,而且把這個例項變數定義在類的外面又會失去封裝性。那還有什麼辦法呢? 真急人。

還好,經過我們的仔細探索,發現了這麼乙個寶藏。那就是struct結構。雖然class定義中是不允許使用靜態成員變數的,但是struct是可以的。比如我們可以這樣寫:

struct

private

這個struct結構是可以順利編譯通過的。我們接下來要做的就是將它和 dbmanager 類結合起來:

class

dbmanager

if !private.instance

return

private.instance!

}}

這樣,我們的單例就基本完成了,把 struct 的定義放到了屬性方法的裡面,這樣從類的外面就不能訪問到它,保證了類的封裝性。

基本很完美了,那麼接下來,我們還要考慮最後乙個問題,就是 執行緒安全,其實做起來也很簡單,就是新增以下dispatch_once的呼叫。相信熟悉 objective-c 開發的同學對這個方法並不陌生。

那麼最後,我們完成後的單例模式定義如下:

class

dbmanager

dispatch_once(&private.token)

return

private.instance!

}}

Swift 單例模式實現及類方法

在開始單例模式之前我們先講一下類方法。應為單例模式需要依靠類方法來實現 首先,我們知道類方法就是 直接使用類名來呼叫,無需生成物件,再去呼叫。其實類方法的生成很簡單,只需要給我們之前的物件方法用class關鍵字來修飾即可 我們來看乙個示例 物件方法 func username string 類方法c...

Swift中定義單例的方法例項

什麼是單例 單例模式是設計模式中最簡單的一種,甚至有些模式大師都不稱其為模式,稱其為一種實現技巧,因為設計模式講究物件之間的關係的抽象,而單例模式只有自己乙個物件。單例模式 singleton pattern 也叫單子模式,是一種常用的軟體設計模式。在應用這個模式時,單例物件的類必須保證只有乙個例項...

swift 中單例的寫法

在swift中單例的寫法和oc的有所不同,在書寫的時候又分很多種寫法,如果乙個.swift 檔案只建立了乙個類,可以用那種dispatch once的寫法,如果乙個.swift檔案中有很多類的存在,則會報錯,需要寫成下邊的寫法,這樣頁更加的簡單 在底部宣告靜態屬性 1static var resou...