覆盖一个计算属性,该属性返回一个Optional值,返回一个非Optional值

时间:2018-01-22 08:12:29

标签: swift override computed-properties

以下编译并在运行Swift 4的Xcode 9.2上运行没有问题:

class ParentWithComputedOptional {
    var computedOptional: Int? { return nil }
}

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

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

这是预期的行为吗?如果是,Apple方案文档中是否有针对此方案的相关页面?

1 个答案:

答案 0 :(得分:2)

在官方语言指南的任何地方都没有记载这种特殊的覆盖情况,但是在Swift的changelog for 4.0版本中提到过(请看SR-1529)。


该主题值得一些其他信息:

实际上,这种行为不仅限于可选,而且还适用于其他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属性进行突变,从而造成类型错误将对象向下转换为Bar类型的变量时。