单例在Swift 3中具有属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例在Swift 3中具有属性相关的知识,希望对你有一定的参考价值。

在Apple的Using Swift with Cocoa and Objective-C document(针对Swift 3更新)中,他们给出了以下Singleton模式的示例:

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

        // setup code

        return instance
    }()
}

让我们假设这个单例需要管理一个可变的字符串数组。如何/在哪里声明该属性并确保它被正确初始化为空的[String]数组?

答案

对我来说这是最好的方法,让init私有化。 Swift 3 4 5语法

// 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]()

}
另一答案

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

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
    }
}
另一答案

根据苹果的文档: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

    static let shared = Singleton()
}

用初始化方法:

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()

    // MARK: - Initializer

    private init() {
    }

}
另一答案

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

以上是关于单例在Swift 3中具有属性的主要内容,如果未能解决你的问题,请参考以下文章

单例在多线程中的使用

Swift实战-单例模式

设计模式----单例模式

使用单例在无尽的 setInterval(,0) 中对 process.exit 的开玩笑测试调用

如何在类扩展中添加静态(存储)属性以制作单例? (迅速)

UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍