最终var和非final var之间的快速差异最终让和非最终让

时间:2016-03-05 19:20:45

标签: swift swift2

最终变量和非最终变量之间有什么区别:

var someVar = 5
final var someFinalVar = 5

let someLet = 5
final let someFinalLet = 5

2 个答案:

答案 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)

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