swift單例的推薦寫法

單例是?個在 Cocoa 中很常?的模式了。對于?些希望能在全局?便訪問的實例,或者在 app 的?命周期中只應該存在?個的對象,我們?般都會使?單例來存儲和訪問。在 Objective-C 中單例的公認的寫法類似下?這樣:

@implementation Singleton

+ (id)shared {
    static Singleton *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
    });
    return instance;
}

@end

在 Swift ?我們其實有?個更簡單的保證線程安全的?式,那就是 let 代碼如下:

class Singleton {
    class var shared: Singleton {
        struct Static {
            static let instance: Singleton = Singleton()
        }
        return Static.instance
    }
}

還有另?種更受?家歡迎,并被認為是 Swift 1.2 之前的最佳實踐的做法。由于 Swift 1.2 之前class 不?持存儲式的 property ,我們想要使??個只存在?份的屬性時,就只能將其定義在全局的 scope 中。值得慶幸的是,在 Swift 中是有訪問級別的控制的,我們可以在變量定義前?加上 private 關鍵字,使這個變量只在當前?件中可以被訪問。這樣我們就可以寫出?個沒有嵌套的,語法上也更簡單好看的單例了:

import Foundation

private let instance = Singleton()
class Singleton {
    class var shared: Singleton {
        return instance
    }
}

在 Swift 1.2 以及之后,如果沒有特別的需求,我們推薦使?下?這樣的?式來寫?個單例:

import Foundation

class Singleton {
    private static let instance = Singleton()
    class var shared: Singleton {
        return instance
    }
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容