最终变量和非最终变量之间有什么区别:
var someVar = 5
final var someFinalVar = 5
和
let someLet = 5
final let someFinalLet = 5
答案 0 :(得分:17)
Swift Language Reference中描述了final
修饰符,其中包含
<强>最终强>
将此修饰符应用于类或类的属性,方法或下标成员。它应用于类以指示该类不能被子类化。它应用于类的属性,方法或下标,以指示无法在任何子类中重写类成员。
这意味着没有final
我们可以写:
class A {
var x: Int {return 5}
}
class B : A {
override var x: Int {return 3}
}
var b = B()
assert(b.x == 3)
但如果我们在课程final
中使用A
class A {
final var x: Int {return 5}
}
class B : A {
// COMPILER ERROR
override var x: Int {return 3}
}
然后发生这种情况:
$ swift final.swift
final.swift:6:18: error: var overrides a 'final' var
override var x: Int {return 3}
^
final.swift:2:15: note: overridden declaration is here
final var x: Int {return 5}
答案 1 :(得分:2)
无法在子类中覆盖最终变量。它还向编译器提示,允许它内联变量。换句话说,每次编译器看到某个地方使用的最终变量时,它都可以立即替换该值。编译器是否实际执行此操作取决于编译器及其知道/使用的任何优化。