2017-04-08 94 views
1

我在Mozilla Firefox的iOS版本库中发现了这个。为什么不直接在Swift中使用静态变量?

static let WebServerSharedInstance = WebServer() 

class var sharedInstance: WebServer { 
    return WebServerSharedInstance 
} 

为什么你会创建一个新的变量,只是返回时,你可以做同样在这样一条线相同的变量?

static let sharedInstance = WebServer() 
+0

我修改了我的答案,请确保您仍然认为它已被接受。 – Sulthan

+0

你的回答非常好,给出了两个原因。谢谢你让我高兴! – ntoonio

回答

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是线程安全的。

0

一个建议是,WebServerSharedInstance是全局变量在文件的顶层宣布其只要在文件生命是只要在程序运行的生活 - >您可以使用该变量在所有其他文件中

+0

为什么''WebServerSharedInstance''不是一个全局变量? – ntoonio

+0

WebServerSharedInstance是一个全局变量,您可以在程序的所有其他文件中使用它。 –

+0

那你为什么需要第二个变量? – ntoonio

0

我不确定上下文。但让我解释的主要区别之一

VS

之间
// 1 
class var sharedInstance: WebServer { 
    return WebServerSharedInstance 
} 

// 2 
static let sharedInstance = WebServer() 

1是每次你访问它获取评估,而2得到延迟初始化和评估只计算一次的变量。

如果在你的代码后来有人抽调WebServerSharedInstance

1将返回新的价值,同时2将回头率初始值,如果它得到了前初始化。

+0

你不知道什么是计算变量!可以计算一个变量。这意味着变量,而不是一个值,具有功能。一个函数,即setter,在变量被赋值时被调用。另一个函数getter在引用变量时被调用。 –

+0

不确定你的意思。但仅供参考。 '您可以通过移除get关键字及其大括号来简化只读计算属性的声明。 – MadNik

+0

抱歉,您的权利不正确。不知道你可以删除关键字 –

相关问题