【问题标题】:Confusion Regarding Overriding Class Properties in Swift关于在 Swift 中覆盖类属性的困惑
【发布时间】:2016-06-10 11:55:18
【问题描述】:

我已阅读 Swift 文档并在此处搜索,但我仍然不确定如何实现一个类层次结构,其中每个子类为继承的静态属性设置自定义值;那就是:

  1. 基类定义了一个静态属性:所有实例共享相同的值。
  2. 子类覆盖静态属性:所有实例共享相同的值,与基类不同。

属性可以存储吗?

另外,我应该如何从实例方法中访问属性的值(不管特定的类),并且每次都获得正确的值?下面的代码会起作用吗?

class BaseClass 
{
    // To be overridden by subclasses:
    static var myStaticProperty = "Hello"

    func useTheStaticProperty()
    {
        // Should yield the value of the overridden property
        // when executed on instances of a subclass: 
        let propertyValue = self.dynamicType.myStaticProperty

        // (do something with the value)
    }  

【问题讨论】:

    标签: swift inheritance properties static


    【解决方案1】:

    你离那里很近,除了你不能覆盖子类中的static 属性——这就是static 的含义。所以你必须使用class 属性,这意味着它必须是一个计算属性——Swift 缺少存储的class 属性。

    所以:

    class ClassA {
        class var thing : String {return "A"}
        func doYourThing() {
            print(type(of:self).thing)
        }
    }
    class ClassB : ClassA {
        override class var thing : String {return "B"}
    }
    

    让我们测试一下:

    ClassA().doYourThing() // A
    ClassB().doYourThing() // B
    

    【讨论】:

    • 谢谢。因此,如果类变量恰好包含从文件中读取的一些大字典(我无法每次都计算),我将不得不为每个子类设置一个单独的私有存储静态变量,将我的字典存储在那里,并在重写(计算)类属性中返回其值,对吗?
    • @NicolasMiari 解决“类变量不能存储属性”限制的一种方法是将每个类放在自己的文件中(你通常无论如何都要这样做) 然后创建一个文件范围的存储属性 var 来支持类计算属性 var,如下所示:fileprivate static var _thingStorage : String。然后在您的班级中,您的计算属性变为override class var thing : String { return _thingStorage }
    • 您的评论完成了接受的答案! @NicolasMiari
    • 你介意为 Swift 4 更新这个吗? (dynamicType 不再编译。)然后我们可以关闭 stackoverflow.com/q/52670640/1187415 作为这个的副本。
    • @MartinR 别担心。
    猜你喜欢
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2020-02-23
    相关资源
    最近更新 更多