2016-03-05 88 views

回答

13

final改性劑在Swift Language Reference描述,它說

最終

應用此改性劑的一類或一屬性,方法,或下標a類的成員。它被應用於一個類來表明該類不能被子類化。它應用於類的屬性,方法或下標,以指示類成員不能在任何子類中重寫。

這意味着沒有final我們可以這樣寫:

class A { 
    var x: Int {return 5} 
} 
class B : A { 
    override var x: Int {return 3} 
} 
var b = B() 
assert(b.x == 3) 

,但如果我們在課堂上使用finalA

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

最終變量不能在子類中重寫。它也向編譯器提出這個問題,它允許它內聯變量。換句話說,每當編譯器看到某個地方使用的最終變量時,它就會立即替換該值。編譯器是否真的這樣做取決於編譯器以及它知道/使用的任何優化。