static vs class as class variable/method (Swift) 静态 vs 类作为类变量/方法(Swift)

8 浏览
0 Comments

static vs class as class variable/method (Swift) 静态 vs 类作为类变量/方法(Swift)

我知道static关键字用于在structenum等中声明类型变量/方法。\n但今天我发现它也可以用于class实体。\nclass foo {\n static func hi() {\n println(\"hi\")\n }\n class func hello() {\n println(\"hello\")\n }\n}\n\nstatic关键字在class实体中的用途是什么?\n谢谢!\n编辑:我指的是Swift 1.2,如果有什么不同。

0
0 Comments

在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 5中,使用type(of: self)来访问类属性是可以的,然而在Swift 5.1中,这种方式将被弃用,应该使用Self来代替。因此,问题的出现源于代码中使用了已被弃用的方法。

解决方法:

为了解决这个问题,我们需要将type(of: self)替换为Self。这样,代码将使用最新的Swift语法,以便与Swift 5.1兼容。

下面是修复后的代码:

class NetworkManager {

private static var _maximumActiveRequests = 4

class var maximumActiveRequests: Int {

return _maximumActiveRequests

}

func printDebugData() {

print("Maximum network requests: \(Self.maximumActiveRequests).")

}

}

class ThrottledNetworkManager: NetworkManager {

private static var _maximumActiveRequests = 2

override class var maximumActiveRequests: Int {

return _maximumActiveRequests

}

}

ThrottledNetworkManager().printDebugData()

这样,代码将正确输出2。

0
0 Comments

在类中,static和class关键字都可以用于相同的目的。然而,在Swift 1.2之前(当前为beta版本),static关键字是不可用的。相反,class关键字可以用于声明静态方法和计算属性,但不能用于声明存储属性。

为了解决这个问题,Swift 1.2引入了static关键字,使得可以用它来声明静态存储属性。这样,我们就可以使用static关键字来替代class关键字来声明静态属性和方法。

0
0 Comments

在Xcode 3 beta 3版本的发布说明中,提到了“static”方法和属性现在可以在类中使用(作为“class final”的别名)。

因此,在Swift 1.2中,以如下方式定义的hi()方法:

class foo {

static func hi() {

println("hi")

}

}

是一个类型方法(即在类型本身上调用的方法),同时也是final(即不能在子类中被重写)。

问题的出现原因是为了在Swift中提供更灵活的类变量和方法的定义方式。在之前的版本中,类变量和方法只能使用关键字"class"来定义,这意味着它们可以被子类继承和重写。而在Xcode 3 beta 3版本中,引入了关键字"static"作为"class final"的别名,以提供一种不可被继承和重写的类变量和方法的定义方式。

解决方法是使用关键字"static"来定义不可被继承和重写的类变量和方法。在上述代码示例中,"hi()"方法被定义为静态方法,即使用关键字"static"来修饰。这样一来,无论是否创建了类的实例,都可以直接调用该方法,而且它也不能被子类继承或重写。

通过使用"static"关键字,我们可以更灵活地定义类变量和方法,以满足不同的需求。这种方式使得代码更加清晰和易于维护,同时也提供了更好的封装性和安全性。

总结起来,"static"关键字的引入解决了Swift中定义类变量和方法的限制问题,为开发者提供了更多的选择和灵活性。现在可以通过使用"static"关键字来定义不可被继承和重写的类变量和方法,从而使代码更加可读、易于维护,并提供更好的封装性和安全性。

0