2016-11-23 55 views
0
class MyManager { 

private static var __once:() = { 
    Static.instance = MyManager() 
}() 

class var sharedInstance: MyManager { 
    struct Static { 
     static var onceToken: Int = 0 
     static var instance: MyManager? = nil 
    } 
    _ = MyManager.__once 
    return Static.instance! 
} 

fileprivate init() { 
    print("MyManager init"); 

} 
....... etc 

稱之爲斯威夫特3 - 辛格爾頓

aManager = MyManager.sharedInstance 

結果

MyManager init fatal error: unexpectedly found nil while unwrapping an Optional value 

回答

1

_ = MyManager.__once並沒有叫你__once功能,它是它分配給什麼。你忘了()

MyManager.__once() 

這是需要_ =的整個目的,讓你意識到你正在處理函數本身,而不是一個函數調用。

無論如何,這是一個單身的不必要的複雜和混亂的暗示。所有你需要的是:

class MyManager { 
    static let instance = MyManager() 
} 

這是懶惰的,線程安全的,理智的。

+0

的問題是,如果我不刪除我得到的編譯器支架「不能調用非功能型()的值」 – Marin

+0

此外,你的'__once'功能是不是一個函數,它的類型是'()',又名'Void'。你需要它是'() - >()'。在任何情況下,不要做任何這種大聲笑,這是可怕的 – Alexander

+0

謝謝我不會這樣做:) – Marin

0

對我來說這是最好的方法,使init私人。

// MARK: - Singleton 

final class Singleton { 

    // Can't init is singleton 
    private init() { } 

    // MARK: Shared Instance 

    static let shared = Singleton() 

    // MARK: Local Variable 

    var emptyStringArray : [String] = [] 

}