【问题标题】:Confused by the usage of a class or a struct as container for static variables (Swift)对使用类或结构作为静态变量的容器(Swift)感到困惑
【发布时间】:2021-09-18 09:33:12
【问题描述】:

在我的应用程序中,我目前使用单独的class 来存储我想随时随地访问的一堆静态变量。

class Sounds {
    static var soundInitial : Sound!
    static var soundThunder : Sound!
    static var soundWind    : Sound!
    // etc... (about 50 more)
}

这个Sounds从未被用作实例,而是作为所有音效的容器(类型为Sound - 这是一个单独的类)

我在viewDidLoad 期间从主视图控制器初始化所有音效:

let urlPath1 = Bundle.main.url(forResource: "art.scnassets/sounds/my_sound_file", withExtension: "mp3")
Sounds.soundInitial = Sound(url: urlPath1!, volume: 1.0)
// etc...

然后我可以像这样在任何给定时间使用它:

Sounds.soundInitial.play(numberOfLoops: -1) // endless looping

作为一个还没有那么好的经验的程序员,我非常基本的问题:

有没有更常用的方法或更好的方法将我的所有声音变量集中存储在一起? (我不想在 View Controller 中定义它们,因为这也会给我那里有很多变量...)

我发现,我可以使用struct 来达到同样的效果。但这会是更好的方法吗?

在 Swift 中是否有专门为此目的而设计的 Container Object

【问题讨论】:

  • 如果您为此使用类或结构,那么您应该声明一个私有 init 以便不能创建实例,private init() {}。但更常见的方法是对静态变量使用枚举(只需将上面代码中的“类”一词替换为“枚举”即可)。
  • 这很有魅力。太简单。完美的评论!

标签: swift class enums containers


【解决方案1】:

您正在做的是将全局常量聚集到命名空间中。

在 Swift 中是否有专门为此目的设计的容器对象?

是的,无壳枚举是执行此操作的传统方式,因为它是最轻量级的,不会被意外实例化;它是“纯”命名空间。

如果您观看一些 Apple 视频,您会发现他们就是这样做的。就我个人而言,我曾经推荐过一个结构,但由于给出的原因,我已经改用枚举。

【讨论】:

  • 这很有魅力。太简单。完美答案!
猜你喜欢
  • 2018-03-30
  • 2016-11-22
  • 1970-01-01
  • 2016-06-30
  • 2012-12-23
  • 2021-09-01
  • 1970-01-01
  • 2023-03-26
  • 2015-04-17
相关资源
最近更新 更多