final变量和非final变量有什么区别:
var someVar = 5
final var someFinalVar = 5
和
let someLet = 5
final let someFinalLet = 5
final
修饰符在Swift语言参考中有详细描述:
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)
但是如果我们在类A
中使用final
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}
在子类中无法覆盖final变量。这也向编译器暗示,允许它将该变量内联。换句话说,每当编译器看到某个地方使用final变量时,它可以立即替换值。编译器是否实际执行此操作取决于编译器及其所知道/使用的任何优化。