【问题标题】:Swift: Singleton class object variable initializationSwift:单例类对象变量初始化
【发布时间】:2017-05-19 17:19:20
【问题描述】:

我正在尝试在单例类中创建 int 对象变量。这是我的 ObjC 版本:

+(MyClass*) single
{
    static MyClass *shareObject = nil;
    static dispatch_once_t onceToken;
    dispatch_once ( &onceToken, ^{
        shareObject = [[self alloc] init];
        shareObject.myArray = [NSMutableArray new];
    });
    return shareObject;
}

Swift 版本:

class MyClass {

    static let sharedInstance = MyClass()
    var myArray = Array<Any>()
}

如果是 ObjC 版本,我知道 myArray 是 init 一次。但如果是 Swift 版本,我要问你们。 myArray 变量会被初始化一次吗?

【问题讨论】:

  • 您可能有兴趣知道 static(或全局)存储变量的访问器当前实际上在 Apple 平台的底层使用 dispatch_once(比较 stackoverflow.com/q/43374222/2976878) - 使其更多或更少直接等效于您的 Obj-C +single 方法。

标签: objective-c swift singleton


【解决方案1】:

您需要添加一个私有初始化程序以确保没有其他人可以手动实例化MyClass

class MyClass {
    static let sharedInstance = MyClass()

    var myArray = Array<Any>()

    private init() {}
}

这样,MyClass(单例)只能有一个对象,因此初始化程序(= Array&lt;Any&gt;())只会运行一次。而这一切都是线程安全的。

【讨论】:

  • 如果我使用私有的 init()。由于私有保护,我得到初始化程序是不可访问的。在 ObjC 示例中 shareObject.myArray = [NSMutableArray new];该数组可以用于任何类,由保持内容的单身人士使用
  • “由于私有保护,我的初始化程序无法访问”这就是单例的全部意义。您想要一个对象的单个实例(sharedInstance,正如您所命名的那样),仅此而已。
  • 您必须使用 MyClass.sharedInstance.myArray 访问单例类的属性。您无法创建 myclass 的对象。您正在尝试获取它的实例,这就是它给出错误的原因
  • @UmerFarooq 这就是我要找的。我真的很感激
猜你喜欢
  • 2013-07-04
  • 2013-05-15
  • 2023-03-25
  • 1970-01-01
  • 2016-07-28
  • 2017-03-20
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多