Быстрое различие между окончательным var и non-final var | окончательный let и non-final let

Какая разница между конечными переменными и не конечными переменными:

var someVar = 5
final var someFinalVar = 5

и

let someLet = 5
final let someFinalLet = 5

Ответ 1

Модификатор final описан в Swift Language Reference, в котором говорится

конечная

Применить этот модификатор к классу или к свойству, методу или члену индекса класса. Он применяется к классу, чтобы указать, что класс can not должен быть подклассом. Он применяется к свойству, методу или индексу класса, чтобы указать, что член класса не может быть переопределен в любом подклассе.

Это означает, что без 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}

Ответ 2

Конечные переменные не могут быть переопределены в подклассах. Это также указывает на компилятор, который позволяет ему встраивать переменную. Другими словами, каждый раз, когда компилятор видит конечную переменную, которая используется где-то, она может немедленно заменить значение. Независимо от того, действительно ли это компилятор делает это с компилятором и любыми оптимизациями, которые он знает/использует.