在这种情况下如何解决歧义,前提是我无法为每个类更改名称Static
和名称SOMECONST
(以保持API类中的一致约定)
它可能在游乐场中有效,也可能无效,但在Xcode编译期间出现错误AMBIGUOUS USE OF SOMECONST
。
如果不可能,那么我将恢复吸气,任何人都知道Apple是否会为课程实施static
,或者它仅针对struct
和enum
而设计? ??
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()
答案 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"
}