【问题标题】:Why can I create an instance of a static variable?为什么我可以创建静态变量的实例?
【发布时间】:2024-04-20 02:00:09
【问题描述】:

我有一个class,看起来像这样:

class A {
    var aString = ""
    static var staticString = ""
}

如果我创建Ainstance,我将无法访问static property

var a = A()
a.staticString = "THIS GIVES AN ERROR"

但是,如果我创建一个直接的 instancestatic variable 它可以工作:

var a = A.staticString
a = "THIS WORKS"

我理解静态变量的方式是你应该只能像这样直接访问它们:A.staticString = "hello"。但这似乎并非如此。

(对我来说)更令人困惑的是,我可以创建多个 instances 并使用它们自己的单独值;那就是值不会保留static

var a = A.staticString
a = "AAA"

var b = A.staticString
b = "BBB"
print(a) //prints AAA
print(b) //prints BBB

static 变量不应该...保持静态吗?在我看来,a 和 b 都应该打印 BBB,因为 b = "BBB" 应该已经覆盖了分配给它的第一个值。

为了让它更加混乱(对我来说),使用 singleton 确实给了我预期的结果:

class A {
    static let shared = A()
    var aString = ""
    static var staticString = ""
}
let instance1 = A.shared
instance1.aString = "A String"
        
let instance2 = A.shared
instance2.aString = "Another String"
        
print(instance1.aString, instance2.aString) //Both print "Another String"

有好心人能帮我解决问题吗?

【问题讨论】:

  • 变量保持静态,复制到ab,它们与静态变量无关,只是两个字符串变量。
  • staticconstant (let) 不同。

标签: swift static singleton instance


【解决方案1】:

Swift 中的 static 关键字并不意味着该属性是不可变/恒定的(与基于 C 的语言不同)。 static 表示该属性是类型属性,而不是实例属性,意味着它是类型本身的属性,在所有实例之间共享,而不是每个实例。如需更多信息,请阅读 Swift 语言指南的Type Properties 部分。

常量/不可变属性由let 声明,而可变属性由var 声明。

您可以使用类型名称(在您的情况下为A)设置和获取静态变量。

A.staticString = "new"
A.staticString // "new"

如果您创建该类型的实例,您可以使用type(of:) 获取元类型 (A),您可以使用它来访问静态属性

let a = A()
type(of: a).staticString // "new"
let anotherA = A()
type(of: anotherA).staticString  // "new"

【讨论】: