当前位置: 首页 > 面试题库 >

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

嵇丰
2023-03-14
问题内容

对于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.整个项目。

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

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


问题答案:

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

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

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

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



 类似资料:
  • 问题内容: 我指的是模块中的OrderedDict,这是一个有序的字典。 如果它具有可订购的附加功能,我意识到这通常不是必需的,但是即使如此,是否还有缺点?慢一点吗?是否缺少任何功能?我没有看到任何丢失的方法。 简而言之,为什么我 不 总是使用它而不是普通的词典? 问题答案: 是的子类,并且需要更多内存来跟踪键的添加顺序。这不是小事。该实现在幕后增加了第二个,所有键的双向链接列表(这是记住顺序的部

  • 版本: 返回一个,其ID为“z”,偏移量为0,默认区域规则。 返回一个,包含ID“utc”和。 例如,在处理时。在这里,我能发现的唯一区别是它的打印方式不同。 我们正在来回地进行代码审查讨论,所以我想这种冲突并不罕见。 它是一个常量(此外,它的偏移量值(0)甚至被缓存)。 由于缺少区域信息,它的开销少了一点。 在UTC时,不需要考虑夏时制时间或历史变化,就像在任何其他时区一样。 因此,对于我迄今为

  • 我试图创建一个Singleton类,我想创建一个UIImage的实例。 目标C 我们可以在中简单地声明一个属性。h喜欢 并在. m中定义一个share dSingleton方法 从任何一个有 我正在寻找从过去2小时,但没有找到蚂蚁适合的教程来创建这个。请帮我创建一个单例类在swft,并告诉我如何调用实例变量。

  • 回顾Java 8API设计时,我对参数的泛型不变性感到惊讶: 同一个API的一个看起来更通用的版本可能已经在对的单独引用上应用了协方差/逆方差,例如: 这将允许当前不可能的以下操作: 解决办法是使用方法引用将类型“强制”为目标类型: C#没有这个特殊的问题,因为定义如下,使用声明-站点方差,这意味着任何使用的API都可以免费获得这个行为: 与建议的设计相比,现有的设计有什么优势(以及可能的,决策的

  • 问题内容: 似乎大多数人都使用XMLHttpRequest进行异步请求,但是很明显,可以执行同步请求的事实表明这样做可能是有正当理由的。那么,那个合理的原因可能是什么? 问题答案: 我认为随着HTML 5标准的发展,它们可能会变得越来越流行。如果将Web应用程序授予Web工作人员访问权限,那么我可以预见,开发人员将使用专用的Web工作人员来进行同步请求,如Jonathan所说,以确保一个请求先于另

  • 我读了很多关于应该使用的案例。 我读过的许多页面都说不应该用于私有实例变量,而应该由getters返回。 我认为将私有实例变量作为可选变量仍然是有用的。如果有人查看我的代码,他们可以看到一个值可以是空的,而不必检查留档是否可以返回空。 在Scala中,null从未使用过,它只是用于与Java的互操作性。如果值可以为null,建议始终使用可选值。这种方法对我来说更有意义。 这里有一页提到了它: ht