继承下的结构静态变量

时间:2015-01-06 13:06:45

标签: swift

在这种情况下如何解决歧义,前提是我无法为每个类更改名称Static和名称SOMECONST(以保持API类中的一致约定)

它可能在游乐场中有效,也可能无效,但在Xcode编译期间出现错误AMBIGUOUS USE OF SOMECONST

如果不可能,那么我将恢复吸气,任何人都知道Apple是否会为课程实施static,或者它仅针对structenum而设计? ??

public class A {

    public struct Static {
        public static let SOMECONST = 1
    }

    init(val: Int) {
        println(val)
    }
}

public class B: A {

    public struct Static {
        public static let SOMECONST = 2
    }

    init() {
        super.init(val: B.Static.SOMECONST)
    }

}

B()

1 个答案:

答案 0 :(得分:1)

该程序(不出所料)无法编译,因为它找到了SOMECONST符号的两个候选者:

error: ambiguous use of 'SOMECONST'
    super.init(val: B.Static.SOMECONST)
                      ^
note: found this candidate
    static let SOMECONST = 2
               ^
note: found this candidate
    static let SOMECONST = 1
               ^

使用嵌套类型来存储这样的常量通常是个坏主意,因为子类不能覆盖嵌套类型。您应该将常量直接声明为类的一部分。

现在,理想情况下你会做这样的事情:

class A {
    class let SOMECONST = 1
}

class B: A {
    override class let SOMECONST = 2
}

但是,遗憾的是,当前的Swift编译器不支持此功能。覆盖类(静态)变量的唯一方法是使其可计算:

class A {
    class var SOMECONST: Int {
        return 1
    }
}

class B: A {
    override class var SOMECONST: Int {
        return 2
    }
}

这有点丑陋,但它确实有效。您现在可以创建B的初始化程序:

init() {
    super.init(val: B.SOMECONST) // prints "2"
}