2016-06-21 70 views
75

属性在苹果的Using Swift with Cocoa and Objective-C document(更新的斯威夫特3)他们给Singleton模式下面的例子:辛格尔顿在斯威夫特3

class Singleton { 
    static let sharedInstance: Singleton = { 
     let instance = Singleton() 

     // setup code 

     return instance 
    }() 
} 

让我们想象一下,这个单需要管理字符串变量数组。我将如何/在哪里声明该属性并确保它已正确初始化为空[String]阵列?

+4

我不知道为什么你还是没有接受这些答案的任何人。 – 2016-07-25 07:36:57

回答

203

对我来说这是最好的方法,使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] = [] 

} 
+2

这应该是正确的答案! – Roman

+0

谢谢你:) @Roman – YannickSteph

+3

我upvoted这个答案,但匹配Swift 3语法,“sharedInstance”应改为只是“共享”。 –

2

任何初始化都将在init方法中完成。单身人士和非单身人士没有区别。

+24

直接回答问题的附加代码片段会使此答案更有帮助。 –

53

您可以像这样初始化一个空数组。

class Singleton { 

    //MARK: Shared Instance 

    static let sharedInstance : Singleton = { 
     let instance = Singleton(array: []) 
     return instance 
    }() 

    //MARK: Local Variable 

    var emptyStringArray : [String] 

    //MARK: Init 

    init(array : [String]) { 
     emptyStringArray = array 
    } 
} 

或者,如果你更喜欢不同的方法,这一个将会很好。

class Singleton { 

    //MARK: Shared Instance 

    static let sharedInstance : Singleton = { 
     let instance = Singleton() 
     return instance 
    }() 

    //MARK: Local Variable 

    var emptyStringArray : [String]? = nil 

    //MARK: Init 

    convenience init() { 
     self.init(array : []) 
    } 

    //MARK: Init Array 

    init(array : [String]) { 
     emptyStringArray = array 
    } 
} 
+0

此方法不适用于扩展吗? '''扩展高速缓存{ 静态让利sharedInstance:缓存= { 让实例=缓存() 回报实例 }() }''' –

+1

有趣的是苹果使用iOS中10'类var'为单身(例如UIApplication)。他们的实施是否与此相同? – jjatie

+2

我更喜欢singleton init方法作为'private'方法,甚至不是'internal'。这可以防止其他人使用该类的默认“()”初始值设定项。 –

24

作为每苹果的文档:In Swift, you can simply use a static type property, which is guaranteed to be lazily initialized only once, even when accessed across multiple threads simultaneously

class Singleton { 

    // MARK: - Shared Instance 

    static let sharedInstance = Singleton() 
} 

或者用初始化方法:

class Singleton: NSObject { 

    // MARK: - Shared Instance 

    static let sharedInstance: Singleton = { 
     let instance = Singleton() 
     // setup code 
     return instance 
    }() 

    // MARK: - Initialization Method 

    override init() { 
     super.init() 
    } 
} 
+0

这应该是正确答案! – BadmintonCat

+0

Thanks @BadmintonCat –

+0

为什么init()不是私有的? – XcodeNOOB