【问题标题】:Controllers in my code base in swift is defined as struct not classes我的代码库中的控制器 swift 被定义为结构而不是类
【发布时间】:2017-11-09 08:17:09
【问题描述】:

我来自 Objc 背景和 swift 新手。

这个注释是什么意思“///以静态方式使用”

/// Used in a static manner
struct RecentItemsController {
    fileprivate init() { }
}

我真的需要这个 init() 吗?

在整个代码库中我都没有写RecentItemsController(),那为什么需要这个构造函数定义呢?

【问题讨论】:

    标签: swift3 static static-methods swift-class


    【解决方案1】:

    fileprivate 保证您不能从此类实例化新对象。所以这是不可能的:

    let recentItemsController = RecentItemsController()
    

    注意:'()'。

    假设它打算用作单例。

    这就是使它成为静态的原因,这就是为什么您从未编写或找到此类的新实例。

    您的RecentItemsController 类中应该有这个静态类的共享实例:

    static let sharedRecentItemsController = RecentItemsController()
    

    并在需要的任何地方使用该实例,如下所示:

    let recentItemsController = RecentItemsController.sharedRecentItemsController
    

    这保证您在代码中的任何地方都使用相同的对象(因此是静态的)。

    额外信息:

    fileprivate 几乎与普通的private 属性相同,后者包含在该类中,但可以在扩展中使用。

    还可以阅读这篇精彩的博文here 中有关静态和单例类的更多信息

    编辑

    我想我会补充一点:也可能是 init 设置为私有,以绝对保证不能为结构创建新实例,因为结构提供了一个成员初始化器:

    如果结构类型没有定义任何自己的自定义初始化器,则它们会自动接收成员初始化器。与默认初始值设定项不同,结构接收成员初始值设定项,即使它存储了没有默认值的属性。 - Apple Developer, section: Memberwise Initializers for Structure Types

    因此,如果您实际上将其用作 Singleton,则使用类比使用结构更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      • 2011-03-05
      • 2011-04-04
      • 2016-11-16
      相关资源
      最近更新 更多