我知道這「一線單」的方式蘋果斯威夫特辛格爾頓實施
final class Singleton {
static let sharedInstance = Singleton()
private init() {}
}
但如果你將尋找到標準的單一對象像UIApplication
你會看到:
我我很好奇蘋果公司用來創建單件的代碼。
我知道這「一線單」的方式蘋果斯威夫特辛格爾頓實施
final class Singleton {
static let sharedInstance = Singleton()
private init() {}
}
但如果你將尋找到標準的單一對象像UIApplication
你會看到:
我我很好奇蘋果公司用來創建單件的代碼。
蘋果官樣介紹Singleton設置在斯威夫特:
class Singleton {
static let sharedInstance = Singleton()
}
或
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
// setup code
return instance
}()
}
,你會的"Adopting Cocoa Design Patterns" in their Swift documentation的 「單身」 部分中找到。
我的問題不是「如何創建singletone」,而是關於蘋果如何在代碼中實現單例。 –
感謝downvote Andrei!如果蘋果公開發布他們的風格指南,你可以相信這是他們告訴他們的工程師在內部執行代碼的方式。或者你想看看在操作系統中如何完成單例的實際源代碼?我不相信iOS或MacOS的任何部分都是在Swift中完成的。 –
沒有冒犯,但是這看起來好像有人問一些關於飲食的具體問題,而你回答像「只是少吃」)) –
這個怎麼樣?
class Singleton {
class func sharedInstance() -> Singleton {
struct Static {
static var instance: Singleton? = nil
static var onceToken: dispatch_once_t = 0
}
dispatch_once(&Static.onceToken) {
Static.instance = self()
}
return Static.instance!
}
@required init() {
}
}
@邁克爾Dautermann的答案是正確的,如果你正在尋找蘋果的建議,就如何在斯威夫特寫單身。
但是,如果您想知道爲什麼來自Cocoa Touch的singleton看起來像他們所做的那樣,答案很簡單。它們不是用Swift編寫的,它們是用Objective-C編寫的,在Objective-C中,單例通常寫成類方法。通常是沿着這條線。
+ (UIApplication * _Nonnull)sharedApplication
{
// This is a typical example of how one might to this in Objective-C
// but we have no way of knowing what code Apple actually has here.
// All we know is that there is a sharedApplication class method.
static UIApplication *sharedApplication = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedApplication = [[UIApplication alloc] init];
});
return sharedApplication;
}
所以這可能是真的,他們建議的書面單的不同方式斯威夫特,但是你看的是一個Objective-C單橋斯威夫特。
我知道這是創建單例的正確方法,但問題是不同的。關於橋接btw的好處。 –
蘋果如何實現單身人士可以在他們的博客here中閱讀。
懶初始化的全局變量(也爲 結構和枚舉靜態成員)在第一次運行時,全球訪問,並 被推出,dispatch_once確保初始化是 原子。這使得在你的代碼中使用dispatch_once很酷的方式: 只是用一個初始化程序聲明一個全局變量,並將其標記爲 私有。
所以基本上他們仍然使用dispatch_once調用,就像在Objective-C時代一樣,但現在它由Swift編譯器在幕後處理。
你看到的僅僅是公共接口,它不允許蘋果如何實現該方法的結論。實現不是開源的,所以除非蘋果工程師決定在這裏揭示它,否則我們無法回答你的問題。 –