覆盖子类swift 1.2中的静态变量

时间:2015-03-22 00:37:20

标签: swift

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}}除非有人有更好的解决方案。

4 个答案:

答案 0 :(得分:27)

documentation说:

  

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

所以它是final,这意味着你无法覆盖它。

答案 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"
   }
}