Swift中的单例用法

ran*_*110 2 singleton swift

我仍然对使用Swift感到困惑,并且希望有人可以帮助澄清我何时以及为什么要他们.根据我对Singleton的理解,它们是单个类实体,这意味着如果我有A类并且我在B类中创建了A类的共享实例,它只是对B中A类的引用,所以如果我改变或修改对象那么引用B类中的A类,原始对象Class不受影响,只有B类中的对象是.

如果我想要A类和B类,并且在B类中创建对A类的直接引用,那么我所做的任何更改都会在A类中发生.直接修改该类,而不是引用该类的对象的实例.

Luc*_*tti 16

独生子

看看这个单身人士课程

final class Singleton {
    static let sharedInstance = Singleton()
    private init() { }

    var value = 0
}
Run Code Online (Sandbox Code Playgroud)

它是如何工作的

NO WAY(源文件以外的地方被定义),因为初始化已被标记此类的创建多于1个实例private.

访问Singleton实例的唯一方法是使用sharedInstance它返回唯一可用的实例.

您可以sharedInstance根据需要从任何类调用多次,然后根据需要复制它.每个变量将始终包含对唯一分配的Singleton 实例的引用Heap.

因此,您所做的每一项改变都sharedInstance将在任何地方共享.

在此输入图像描述

let a = Singleton.sharedInstance
a.value = 1

let b = Singleton.sharedInstance
print(b.value) // 1
b.value = 2

print(a.value) // 2
Run Code Online (Sandbox Code Playgroud)

  • 必须将`Singleton`类标记为`final`,否则我们可以使用子类化和to-parent cast来创建几个`Singleton`实例(从而使_无效)"没有方法(在源文件之外的地方)它被定义为创建多个实例..."上面的_语句",参见[例如本例](https://gist.github.com/dfrib/e26e9cd00806c02d7a1861d2a4661a8f).即使这样的解决方法显然是不好的做法,将"Singleton"标记为"final"也会消除这样做的可能性. (2认同)