覆盖子类中的静态变量 swift 1.2
Posted
技术标签:
【中文标题】覆盖子类中的静态变量 swift 1.2【英文标题】:overriding static vars in subclasses swift 1.2 【发布时间】:2015-03-22 00:37:20 【问题描述】:不像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
相关联,我将恢复为stored properties
,除非有人有更好的解决方案。
【问题讨论】:
【参考方案1】:您可以使用计算属性:
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"
【讨论】:
工作!。但是IDE没有帮助,用cmd +空格【参考方案2】:documentation 说:
“ 静止的 ” 现在允许在类中使用方法和属性(作为“ 班级决赛 ”)。
所以它是final
,这意味着你不能覆盖它。
【讨论】:
【参考方案3】:按照建议,您不能覆盖静态变量,但可以使用类(静态)函数来覆盖。
class A
class func StaticValue() -> AnyObject
return "I am a String"
class B: A
override class func StaticValue() -> AnyObject
return 2
【讨论】:
【参考方案4】:您可以拥有计算的类属性:
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"
【讨论】:
很好的提示。只是几句话-我相信您的意图是public class B: A
而不是public class B
。您还必须添加override
关键字override class var name: String
。不完全理解您对static var storedName: String = defineName()
的意图,因为您不能使用实例方法来初始化静态/类属性。以上是关于覆盖子类中的静态变量 swift 1.2的主要内容,如果未能解决你的问题,请参考以下文章