搜尋

首頁  >  問答  >  主體

objective-c - Swift中單例模式的寫法理解

最近看很多開發的書籍和文章都用這樣的一種寫法:
閱讀來源:http://www.cocoachina.com/swift/20151207/14584.html
書籍閱讀來源:《iOS開髮指南,從零基礎到App Store上架第三版》中的10.4.1的例子
.....
這個是最近的文章

  1. 最醜方法(Swift皮,Objective-C心)

  2. TheOneAndOnlyKraken {
    class var sharedInstance: TheOneAndOnlyKraken {

       struct Static {
           static var onceToken: dispatch_once_t = 0
           static var instance: TheOneAndOnlyKraken? = nil
       }
       dispatch_once(&Static.onceToken) {
           Static.instance = TheOneAndOnlyKraken()
       }
       return Static.instance!

    }
    }

關於這種的寫法,我思考了很久(也有一周以上,也有看其他資料,還是沒理解透徹)
我主要不理解的一個邏輯關係是:
(類中聲明類並創建內部類。應該是這樣,有點繞)
1、在定義的TheOneAndOnlyKraken類中再定義一個TheOneAndOnlyKraken類型的sharedInstance類,這種嵌套,如果創建了一個sharedInstance,那這個sharedInstance和TheOneAndOnlyKraken的邏輯關係該怎麼理解比較通俗易懂?有點死循環的感覺。
2、在sharedInstance類別中定義了一個Static結構體,這個結構體中宣告了一個TheOneAndOnlyKraken類型的變數instance。最後回傳了這個instance變數。這instance和定義的兩個類別之間的邏輯關係又是如何理解比較簡單易懂。

PS:我是個初學者,對這些聲明都比較熟悉,只是其中的邏輯結構不太理解,死循環。個人覺得如果純粹記住這種寫法(不確定是不是一種模板),不理解,都後面寫程式中理解不透其中的邏輯結構,那就知其然不知其所以然。
暫時不理解這種邏輯關係,看網站上一大堆資料,似乎都沒有好的解釋。
求指導!

PHPzPHPz2762 天前583

全部回覆(3)我來回復

  • 给我你的怀抱

    给我你的怀抱2017-04-28 09:06:48

    class这个关键字在这里不是定义一个嵌套类,而是表明sharedInstance是一个类属性,当然shareInstance严格来说也不算楼上所说的computed property(计算属性),而是一个get-only property(只读属性)。在这个只读属性的getter(返回属性的方法)内部定义了一个struct,这个struct内部有两个静态属性,onceToken呢看名字就知道是一个标记,调用dispatch_once的时候要用,dispatch_once是GCD中用来执行一次性方法的函数,你只要理解为传入dispatch_once中的闭包只会执行一次就行了,本例中闭包内只有一句话,就是Static.instance = TheOneAndOnlyKraken()。这句话初始化了一个TheOneAndOnlyKraken实例,然后把这个实例赋值给Static这个结构体中的静态属性instance,最后把Static.instance!返回,也就是返回了TheOneAndOnlyKraken的一个实例,关键就在于Static.instance = TheOneAndOnlyKraken()這條語句只會執行一次,以後就直接回傳已經產生的那個實例了,所以可以保證單例。這樣說明白麼?

    不過說實話,在Swift中寫單例完全不用這麼麻煩。如下即可:

    private let instance = SomeClass()
    class SomeClass {
        public class var singleInstance: SomeClass {
            return instance
        }
    }
    
    //获取单例
    let someClass = SomeClass.singleInstance

    回覆
    0
  • 漂亮男人

    漂亮男人2017-04-28 09:06:48

    sharedInstance不是一個類別, 而是一個靜態的computed property, 這個property的類型是TheOneAndOnlyKraken. 你可以把他想成一個..0個參數的靜態方法

    花括號內的struct ...... return Static.instance!是compute這個property的程式碼, 其中創建instance的部分用dispatch_once保證只執行一次

    回覆
    0
  • PHPz

    PHPz2017-04-28 09:06:48

    可以參考一個外國部落格寫的關於swift單例

    回覆
    0
  • 取消回覆