代码之家  ›  专栏  ›  技术社区  ›  peco

将返回可选值的计算属性重写为返回非可选值的计算属性

  •  7
  • peco  · 技术社区  · 7 年前

    以下内容在运行Swift 4的Xcode 9.2上编译和运行时没有问题:

    class ParentWithComputedOptional {
        var computedOptional: Int? { return nil }
    }
    
    class ChildThatUnwraps: ParentWithComputedOptional {
        override var computedOptional: Int { return 10 }
    }
    

    请注意,在父级中, computedOptional 是一个 Int? ,但在子级中,它被重写为 Int . 此外 override 必须为要编译的代码指定关键字。这在操场和一个合适的项目上都进行了测试。

    这是预期的行为吗?如果是,苹果的文档中是否有与此场景相关的页面?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Alvae    6 年前

    官方语言指南中似乎没有记录这种特殊的覆盖情况,但Swift的 changelog 对于4.0版本(查看SR-1529)。


    此主题值得提供一些附加信息:

    实际上,这种行为不仅限于optionals,还适用于其他 covariant 类型,只要重写的属性是派生类中的计算只读属性。 例如,以下代码也将在Swift 4.1中编译。

    class Animal {}
    class Koala: Animal {}
    
    class Foo {
      var x: Animal { return Animal() }
    }
    class Bar: Foo {
      override var x: Koala { return Koala() }
    }
    

    这是一个不会违反 Liskov substitution principle ,因为基类的属性是只读计算属性。因此,如果 Bar 将保存在类型为的变量中 Foo ,没有办法改变 x 属性,以便在将对象向下转换为类型为的变量时创建类型错误 酒吧 .