【问题标题】:Are static classes supported by Swift?Swift 支持静态类吗?
【发布时间】:2017-08-13 15:01:54
【问题描述】:

我想知道您是否可以在 swift 中创建类似于 C# 中的静态类,即不能实例化的类只能具有静态函数和静态属性。这些类型的类是否可以在 swift 中使用?

如果没有,考虑到 Swift 中可用的工具,重新创建这种设计模式的最有效方法是什么?

【问题讨论】:

  • 无壳enum 是一个不错的选择,例如stackoverflow.com/q/38585344/2976878
  • 谢谢,这是一个非常有用的链接。所以本质上,使用 enum 确保它不能被实例化,然后你只需将所有函数和属性设置为静态!天才!
  • 准确地说——它是用于 stdlib 的 Never 类型的,它不能被实例化。

标签: swift static-classes


【解决方案1】:

不,Swift 没有静态类的概念。但是,如果您无论如何都没有可分配的属性,那么初始化会有什么不同呢?我可以想到 2 个选项:

  • 将该类标记为final,使其不能被继承:final class MyClass { .... }

  • 使用没有继承的structstruct MyUtilities { ... }

【讨论】:

  • 添加private init() 以防止初始化。或者只使用enum
【解决方案2】:

您可以通过将初始化程序设为私有并在属性和方法之前使用 static/class 关键字来获得相同的功能。使用 final 关键字可确保您的类不能被子类化,如果您使用 final,静态方法没有意义因为它们不能被覆盖。

class Bar{
    private init(){}
    static let x = 10

    class func methodA(){
        //do something
    }

    static func methodB(){
        // do something else
    }
}

【讨论】:

    【解决方案3】:

    是的,这是可能的。您只需要将您的类定义为final 并创建构造函数private,例如

    final class Test {
       private init() {
    
       }
    
       static func hello() {
          print("hello")
       }
     }
    
     Test.hello()
    

    【讨论】:

    • 不,你不能继承这个类。关键字final 防止子类化。
    猜你喜欢
    • 2015-12-19
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多