为什么不直接在Swift中使用静态变量?

时间:2017-04-08 06:56:46

标签: swift

我在Mozilla Firefox for iOS存储库中找到了这个。

static let WebServerSharedInstance = WebServer()

class var sharedInstance: WebServer {
    return WebServerSharedInstance
}

为什么你要创建一个新的变量,当你在这样的一行中做同样的变量时,它只返回相同的变量?

static let sharedInstance = WebServer()

3 个答案:

答案 0 :(得分:2)

我查看了代码,我认为我误解了上下文:

class WebServer {
    static let WebServerSharedInstance = WebServer()

    class var sharedInstance: WebServer {
        return WebServerSharedInstance
    }
}

虽然您始终可以使用WebServer.WebServerSharedInstance来访问单例,但WebServer的子类可以覆盖sharedInstance

class MyServer : WebServer {
    override class var sharedInstance: MyServer {
        return MyServer()
    }
}

但是,我在代码中没有找到任何示例,所以下面的原始答案可能是正确的。

原始答案:

你是对的。绝对没有理由这样做。

这可能直接来自Objective-C,它使用类似的单例语法。

另外,使用Swift 1.0,我们不太确定如何创建单例,以及类上的static let是否是线程安全的。

答案 1 :(得分:0)

建议WebServerSharedInstance是在文件顶层声明的全局变量,只要程序运行,文件就会存在 - >您可以在所有其他文件中使用该变量

答案 2 :(得分:0)

我不确定上下文。但让我解释一下

之间的主要区别
// 1
class var sharedInstance: WebServer {
    return WebServerSharedInstance
}

VS

// 2
static let sharedInstance = WebServer()

1是计算变量,每次访问时都会对其进行评估,而2懒惰地初始化并仅评估一次。

如果您的代码稍后有人重新分配WebServerSharedInstance

1将返回新值,而2将继续返回初始值(如果之前已初始化)。