Swift 为什么我可以创建多个Singleton实例,即使它的构造函数是私有的?

Swift 为什么我可以创建多个Singleton实例,即使它的构造函数是私有的?,swift,singleton,swift-playground,Swift,Singleton,Swift Playground,下面的代码是我学习Swift的一本书中的一个单例示例。创建只有一个该类型对象的单例的目的不是吗?在操场上,我已经能够创建多个GameManagers(var a=GameManager(),var b=GameManager()等) 顺便说一句,我知道只有一个defaultManager对象,由于它是静态和常量(let),因此无法更改它。但是我无法使用私有构造函数,因为我可以创建多个GameManagers class GameManager { static let defaultMa

下面的代码是我学习Swift的一本书中的一个单例示例。创建只有一个该类型对象的单例的目的不是吗?在操场上,我已经能够创建多个
GameManager
s(
var a=GameManager()
var b=GameManager()
等)

顺便说一句,我知道只有一个
defaultManager
对象,由于它是静态和常量(let),因此无法更改它。但是我无法使用私有构造函数,因为我可以创建多个
GameManager
s

class GameManager {
    static let defaultManager = GameManager()
    var gameScore = 0
    var saveState = 0
    private init() {}
}

游乐场可以访问私有构造函数,因为只要您的代码与私有代码位于同一文件中,Swift就允许您访问任何
私有的内容

由于直接输入操场编辑器窗口的所有内容都被视为一个文件,因此您可以从任何地方访问任何内容


但是,一旦你将代码放在操场之外,构造函数的可见性就会增强,从而阻止你的代码按预期创建
GameManager
的实例。

这篇文章:很好地解释了推理和理论。操场中的并非所有内容都是一个文件,您可以打开包含游乐场文件的包,或使用导航器(左面板)添加其他文件或资源。将该类放在Sources文件夹中的一个文件中(如果它不在那里,则创建它),然后单例将正常工作。@KennethBruno Cool,很高兴知道这一点!我的意思是你直接在游乐场的编辑器里输入的东西。我对答案进行了编辑,使其更具体。