【问题标题】:overriding static vars in subclasses swift 1.2覆盖子类中的静态变量 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,除非有人有更好的解决方案。

【问题讨论】:

    标签: swift


    【解决方案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() 的意图,因为您不能使用实例方法来初始化静态/类属性。
        猜你喜欢
        • 2016-03-03
        • 2010-10-10
        • 1970-01-01
        • 2014-07-22
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        • 2018-12-08
        相关资源
        最近更新 更多