当前位置: 首页 > 知识库问答 >
问题:

iOS8-Swift:创建一个真正的单例类[duplicate]

颜英博
2023-03-14

我在Swift中创建了一个单例类,如下所示:

class SingletonClass {

    class var sharedInstance: SingletonClass {
        struct Singleton {
            static let instance = SingletonClass()
        }

        return Singleton.instance
    }


    var a: Int?
    var b: Int?
    var c: Int?
}

这允许我从任何地方访问共享实例:

SingletonClass.sharedInstance

虽然这是可行的,但它并没有使这个实例成为整个系统中唯一可能的实例,这就是单例的全部意义。
这意味着我仍然可以创建一个全新的实例,比如:

let DifferentInstance: SingletonClass = SingletonClass()



所以我的问题是:在Swift中是否有办法创建一个真正的单例类,其中只有一个实例可以在系统范围内实现?

共有3个答案

邹桐
2023-03-14

全局变量,嵌套结构,分派一次。选择一个。

全局变量的惰性初始值设定项(也适用于结构和枚举的静态成员)在第一次访问全局变量时运行,并作为dispatch_启动一次,以确保初始化是原子的。这提供了一种在代码中一次性使用dispatch_的酷方法:只需使用初始值设定项声明一个全局变量并将其标记为private。

private let _singletonInstance = SingletonClass()
class SingletonClass {
  class var sharedInstance: SingletonClass {
    return _singletonInstance
  }
}

更多信息请点击这里。https://github.com/hpique/SwiftSingleton

诸葛茂勋
2023-03-14

你误解了单例的本质。单例的目的是提供一个单例,而不是防止邪恶。我可以制作另一个UIApplication来代替share dApplication,但那将是愚蠢的,因为它不是share dApplication。我可以制作另一个NSNotificationCenter来代替defaultCenter,但那将是愚蠢的,因为它不是defaultCenter。重点不是阻止我愚蠢,而是提供一个工厂单例,这就是你已经在做的。别担心,开心点。

吴嘉禧
2023-03-14

只需将您的初始值设定项声明为私有:

private init() {}

现在,只能从同一个文件中创建新实例。

 类似资料:
  • 本文向大家介绍创建一个类Person的简单实例,包括了创建一个类Person的简单实例的使用技巧和注意事项,需要的朋友参考一下 创建一个类Person,包含以下属性:姓名(name)、年龄(age)、朋友(friends数组)、问候(sayhi方法,输出问候语,例如:“你好!”)、交朋友(addFriend方法,向friends里添加一个值),然后创建两个此类的实例:“小张“,22,[“小李”,”

  • 问题内容: 我有一个自动相互连接的Spring bean图。大大简化了图示: 所有这些bean都没有指定范围,这暗示它们是单例(使它们成为显式单例不会改变任何东西,我已经尝试过)。 问题在于,在实例化 单个应用程序上下文之后 ,的实例和包含的 不同 实例。怎么会这样 我试图为它创建public no args构造函数,并且调试已确认创建了多次。所有这些创建的堆栈跟踪都在这里。 我还尝试过为Spri

  • 我有一张相互自动连线的Spring豆图。高度简化的插图: 所有这些bean都没有指定作用域,这意味着它们是单例(我已经尝试过了,让它们显式单例不会改变任何东西)。 问题是,在实例化单个应用程序上下文之后,Bar和Baz的实例包含不同的Foo实例。这怎么会发生? 我尝试为创建公共no args构造函数,并且调试已确认已多次创建。所有这些创建的堆栈跟踪都在这里。 我还尝试为Spring启用调试日志记录

  • 我需要在Swift中创建一个singleton类。谁能帮我查一下密码吗?我已经知道,单例类在创建泛型代码方面非常有用。

  • 问题内容: 我知道如何快速创建单例类。创建单例类的最佳简便方法如下: 但是我不需要任何普通班的单身人士。我需要为viewcontroller类创建单例。所以我用这段代码创建单例 它给我附近的错误 似乎要我使用进行初始化。但是我应该通过什么参数或值? 问题答案: 如果您真的想为某个场景对应的视图控制器设置单例,则可能需要执行以下操作: 在此示例中,情节提要是,问题场景的情节提要标识符是。显然,将这​

  • 我正在快速有效地学习单例模式来创建单例类,并找到了如下创建的最佳方法。 因为我使用了语句,所以它是只读属性,必须是线程安全的,所以从目标C开始就不需要调度一次。用于将变量设置为变量。 但这如何保证在整个应用程序中只创建一个实例呢?有什么我错过的小东西吗?