【问题标题】:swift difference between final var and non-final var | final let and non-final letfinal var 和 non-final var 的区别最终让和非最终让
【发布时间】:2016-03-05 19:20:45
【问题描述】:

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

var someVar = 5
final var someFinalVar = 5

let someLet = 5
final let someFinalLet = 5

【问题讨论】:

    标签: swift swift2


    【解决方案1】:

    final 修饰符在Swift Language Reference 中进行了描述,它表示

    最终

    将此修饰符应用于类或类的属性、方法或下标成员。它应用于一个类以指示该类不能被子类化。它应用于类的属性、方法或下标,以指示类成员不能在任何子类中被覆盖。

    这意味着没有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】:

      最终变量不能在子类中被覆盖。它还向允许它内联变量的编译器提示这一点。换句话说,每当编译器看到某个最终变量在某处使用时,它就可以立即替换该值。编译器是否真的这样做取决于编译器以及它知道/使用的任何优化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-28
        • 2014-01-23
        • 2017-06-16
        • 2011-09-18
        • 2018-08-02
        • 2012-11-14
        相关资源
        最近更新 更多