2015-10-18 63 views
-1

我知道這「一線單」的方式蘋果斯威夫特辛格爾頓實施

final class Singleton { 
    static let sharedInstance = Singleton() 
    private init() {} 
} 

但如果你將尋找到標準的單一對象像UIApplication你會看到:

enter image description here

我我很好奇蘋果公司用來創建單件的代碼。

+1

你看到的僅僅是公共接口,它不允許蘋果如何實現該方法的結論。實現不是開源的,所以除非蘋果工程師決定在這裏揭示它,否則我們無法回答你的問題。 –

回答

0

蘋果官樣介紹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的 「單身」 部分中找到。

+0

我的問題不是「如何創建singletone」,而是關於蘋果如何在代碼中實現單例。 –

+1

感謝downvote Andrei!如果蘋果公開發布他們的風格指南,你可以相信這是他們告訴他們的工程師在內部執行代碼的方式。或者你想看看在操作系統中如何完成單例的實際源代碼?我不相信iOS或MacOS的任何部分都是在Swift中完成的。 –

+0

沒有冒犯,但是這看起來好像有人問一些關於飲食的具體問題,而你回答像「只是少吃」)) –

0

這個怎麼樣?

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() { 

    } 
} 
2

@邁克爾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單橋斯威夫特。

+0

我知道這是創建單例的正確方法,但問題是不同的。關於橋接btw的好處。 –

0

蘋果如何實現單身人士可以在他們的博客here中閱讀。

懶初始化的全局變量(也爲 結構和枚舉靜態成員)在第一次運行時,全球訪問,並 被推出,dispatch_once確保初始化是 原子。這使得在你的代碼中使用dispatch_once很酷的方式: 只是用一個初始化程序聲明一個全局變量,並將其標記爲 私有。

所以基本上他們仍然使用dispatch_once調用,就像在Objective-C時代一樣,但現在它由Swift編譯器在幕後處理。