静态与类作为类变量/方法(Swift)

Posted

技术标签:

【中文标题】静态与类作为类变量/方法(Swift)【英文标题】:static vs class as class variable/method (Swift) 【发布时间】:2015-03-23 09:08:21 【问题描述】:

我知道static关键字用于在structenum等中声明类型变量/方法。

但是今天我发现它也可以用在class实体中。

class foo 
  static func hi() 
    println("hi")
  
  class func hello() 
    println("hello")
  

static 关键字在 class 实体中的用途是什么?

谢谢!

编辑:我指的是 Swift 1.2,如果这有什么不同的话

【问题讨论】:

您在哪个版本的 Xcode 中尝试该代码? developer.apple.com/library/ios/documentation/Swift/Conceptual/…? 【参考方案1】:

来自 Xcode 3 beta 3 发行说明:

现在允许在类中使用“静态”方法和属性(作为 “class final”的别名)。

所以在 Swift 1.2 中,hi() 定义为

class foo 
  static func hi() 
    println("hi")
  

是一个类型方法(即在类型本身上调用的方法) 这也是 final (即不能在子类中被覆盖)。

【讨论】:

【参考方案2】:

在类中,它用于完全相同的目的。然而,在 Swift 1.2(目前处于测试阶段)之前,static 不可用 - 备用 class 说明符可用于声明静态方法和计算属性,但不能用于声明存储属性。

【讨论】:

【参考方案3】:

在 Swift 5 中,我使用 type(of: self) 动态访问类属性:

class NetworkManager 
    private static var _maximumActiveRequests = 4
    class var maximumActiveRequests: Int 
        return _maximumActiveRequests
    

    func printDebugData() 
        print("Maximum network requests: \(type(of: self).maximumActiveRequests).")
    


class ThrottledNetworkManager: NetworkManager 
    private static var _maximumActiveRequests = 2
    override class var maximumActiveRequests: Int 
        return _maximumActiveRequests
    


ThrottledNetworkManager().printDebugData()

打印 2。

在 Swift 5.1 中,我们应该可以使用带有大写 S 的Self,而不是type(of:)

【讨论】:

以上是关于静态与类作为类变量/方法(Swift)的主要内容,如果未能解决你的问题,请参考以下文章

Java|static关键字实例变量与类变量实例方法与类方法

类变量,类方法_听韩顺平课笔记

python 类高级语法 静态方法

Python 面向对象

成员方法

高级语法