一尘不染

有什么理由不使用Swift中的单例“变量”?

swift

对于2015年9月,以下是在Swift中制作单例的确切方法:

public class Model
    {
    static let shared = Model()
    // ( for ocd friends ... private init() {} )

    func test()->Double
        {
        return 3.33
        }
    }

然后在其他地方…

// file ViewController.swift, say
import UIKit
class ViewController:UIViewController
    {
    override func viewDidLoad()
        {
        super.viewDidLoad()
        print("view controller loaded!")
        print("singleton test! \( Model.shared.test() )")
        }
    }

没问题。

然而。我加了这个小东西…

public let model = Model.shared
public class Model
    {
    static let shared = Model()

    func test()->Double
        {
        return 3.33
        }
    }

然后,您可以在整个项目范围内简单地执行以下操作:

class ViewController:UIViewController
    {
    override func viewDidLoad()
        {
        super.viewDidLoad()
        print("view controller loaded!")
        print("singleton test! \( model.test() )")
        }
    }

传统习语:

Model.shared.blah()…在代码库中到处可见

“我的”成语:

model.blah()…在代码库中到处可见

因此,这导致一切看上去都很漂亮:

在此处输入图片说明

(在你的项目中,那些“单变量”将是一些事情,如scores.networking.heuristics.,或任何情况下可能会在您的项目。)

那么,这就是一个“宏似”的成语。

唯一的目的就是代码的外观。

简化的出场ImportantSystem.SharedImportantSystem下来importantSystem.整个项目。

有人能看到这个习语有什么问题吗?

问题可能是技术性,风格性或任何其他类别,只要它们确实很深。


阅读 227

收藏
2020-07-07

共1个答案

一尘不染

从功能上讲,它们非常相似,但是我建议您使用Model.shared语法,因为这样可以使您无论在哪里使用它都非常清楚地知道要处理的是单例,而如果只是在其中model浮动了全局变量,则不清楚您正在处理什么。

同样,对于全局变量(特别是带有简单名称的“模型”,例如“模型”),您可能会遇到一些将来的类,它们具有类似的变量名称,并意外地引用了错误的变量。

有关有关全局变量v单身变量或其他模式的一般注意事项的讨论,请参阅全局变量是错误的,尽管标题相当抢眼,但它进行了清醒的讨论,具有一些有趣的链接并提出了替代方案。


顺便说一句,对于您的“
OCD朋友”(我想我应该在其中,因为我认为这是最佳做法),不仅会声明initprivate,而且您可能会声明整个类为final,以避免子类化(这时它与哪些shared引用不明确)。

2020-07-07