【问题标题】:Swift - What is a better alternative to Global Variables?Swift - 全局变量的更好替代方案是什么?
【发布时间】:2021-02-09 13:52:13
【问题描述】:

上下文

你好,
我喜欢使用全局变量来调用管理器或服务来处理某些代码。
但是我的代码分析器 (SonarQube) 中出现了代码异味。

问题

表格A和B有很大区别吗?还是我根本不应该使用其中任何一个? 我更喜欢表格 A,但我想避免/抑制/解决代码异味。

表格 A

一些例子,我更喜欢:

app.logout()
cameraManager.doSomething()
userDefaults.set(.example, true)
analytics.logEvent(.clicked_button)
popupManager.showPopup(message: "Hello world!")

以上可以通过以下方式实现:

var app = Global()

class Global {

}

表格 B

另一种选择是:

class Global {
    private init() {}
    public static let app = Global()
}

然后用法将更改为Global.app.logout()

代码气味

我部分同意这些观点,但表格 B 不也一样吗? 如果是这样,除了我上面展示的方法之外,还有更好的方法吗?

我很想听听您的见解!

【问题讨论】:

  • 您可能还想在codereview.stackexchange.com/questions/tagged/swift上发布此问题
  • 您应该始终尽量避免使用全局变量。首先学习如何使用单例,然后学习如何使用依赖注入。
  • 感谢@emrepun,看起来很有趣,稍后会查看!
  • @nicksamo 如果我们谈论 SwiftUI,你会推荐使用 EnvironmentObject 而不是所有单例用法吗?快速来源:mokacoding.com/blog/swiftui-dependency-injection 或者你觉得单例(不是全局变量)还有它们的位置吗?
  • 创建一个class App { static func logout() { ... } },这样您就可以将其用作App.logout()。没有单例(至少没有公开的,如果需要,内部 App 仍然可以作为单例工作),没有全局变量。

标签: ios swift oop swiftui global-variables


【解决方案1】:

您面临的问题是全局变量本身通常被认为是代码异味。

基本上,您是在说“我喜欢 <code smell>,但我的代码分析器将其标记为代码异味。”

你考虑过让你的经理对象单例吗?考虑一下 Apple 用于 UserDefaults 之类的模式(一个类 var standard,它返回共享的 UserDefaults 对象。)

编辑:

重读您的问题,我想这就是您在表单 B 中的建议。这使得静态 var 成为类的类变量,并将对象变成单例。它与全局并不完全相同。

【讨论】:

  • 感谢您的回答,邓肯!还要仔细检查我的问题!您能否详细说明一下您认为全局变量和单例之间的主要区别是什么?我的同事向我指出了这个有用的视频cocoacasts.com/…。但我也想听听你的意见!此外,我想改用依赖注入,但我对在类或结构扩展中使用它没有信心。在 SwiftUI 中我倾向于使用 EnvironmentObject,但这可能会带来很多不必要的复杂性,你的想法是什么?
  • 另外,您对我可以在任何地方使用的合适名称有什么建议吗?我倾向于“.instance”,但也有“.shared”和“.standard”。我试图做一个扩展,让我的类继承一个“Singleton”结构/类,这样我就不必编写额外的样板代码,但我也遇到了一些麻烦。
  • 全局变量和单例都是你应该避免的事情。如果您确实需要它们,我认为单例属性的命名取决于您。我更喜欢.shared,但这是个人喜好。
  • 谢谢邓肯,我现在已经接受了你的回答!从这里开始,我将进一步研究单例和依赖注入。
猜你喜欢
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 2018-01-07
  • 1970-01-01
  • 2011-02-06
相关资源
最近更新 更多