与class
var不同,它们可以在子类中重写,我相信同样适用于static
但不幸的是。这是一个例子
public class A {
private static let NAME: String = "A"
}
public class B: A {
private static let NAME: String = "B" //error
}
在我看来静态意味着与该特定类的关联,因此在上面的示例B
应该获得它自己的空间来重新定义该变量,因为它仅与B
相关联,我正在恢复为{ {1}}除非有人有更好的解决方案。
答案 0 :(得分:27)
答案 1 :(得分:23)
您可以使用计算属性:
class A {
class var Name: String {
return "A"
}
}
class B: A {
override class var Name: String {
return "B"
}
}
用法:
print(A.Name) // "A"
print(B.Name) // "B"
答案 2 :(得分:15)
根据建议,您不能覆盖静态变量,但可以使用类(静态)函数来覆盖。
class A {
class func StaticValue() -> AnyObject {
return "I am a String"
}
}
class B: A {
override class func StaticValue() -> AnyObject {
return 2
}
}
答案 3 :(得分:3)
您可以拥有计算类属性:
public class A {
class var NAME: String {
return "A"
}
}
public class B {
class var NAME: String {
return "B"
}
}
如果需要,您甚至可以“分支”到子类中的存储属性:
public class A {
// Needs to be overriden in subclass
class var NAME: String {
return "A"
}
}
public class B {
class var NAME: String {
return B.storedName
}
static var storedName: String = defineName()
func defineName() -> String {
// You could do something more complex here
return "B"
}
}