Swift中final var和non-final var的区别 | final let和non-final let的区别

19

final变量和非final变量有什么区别:

var someVar = 5
final var someFinalVar = 5

let someLet = 5
final let someFinalLet = 5
2个回答

25

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}

2

在子类中无法覆盖final变量。这也向编译器暗示,允许它将该变量内联。换句话说,每当编译器看到某个地方使用final变量时,它可以立即替换值。编译器是否实际执行此操作取决于编译器及其所知道/使用的任何优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接