pec*_*eco 6 overriding swift computed-properties
以下编译和运行在运行Swift 4的Xcode 9.2上没有问题:
class ParentWithComputedOptional {
var computedOptional: Int? { return nil }
}
class ChildThatUnwraps: ParentWithComputedOptional {
override var computedOptional: Int { return 10 }
}
Run Code Online (Sandbox Code Playgroud)
请注意,在父级中,computedOptional是一个Int?,但在子级中它被重写为Int.此外,override必须为要编译的代码指定关键字.这在Playground和一个合适的项目上进行了测试.
这是预期的行为吗?如果是,Apple方案文档中是否有针对此方案的相关页面?
这种特殊的覆盖情况似乎没有在官方语言指南中的任何地方记录,但在 Swift 4.0 版本的变更日志中提到(查找 SR-1529)。
这个主题需要一些额外的信息:
实际上,这种行为不仅限于可选值,还适用于其他协变类型,只要重写的属性是派生类中的计算只读属性即可。例如,以下代码也可以在 Swift 4.1 中编译。
class Animal {}
class Koala: Animal {}
class Foo {
var x: Animal { return Animal() }
}
class Bar: Foo {
override var x: Koala { return Koala() }
}
Run Code Online (Sandbox Code Playgroud)
这是一种不违反里氏替换原则的边缘情况,因为基类的属性是只读的计算属性。因此,如果 的实例Bar被保存在类型 的变量中Foo,则无法改变其x属性,从而在将对象向下转换为类型的变量时会产生类型错误Bar。
| 归档时间: |
|
| 查看次数: |
437 次 |
| 最近记录: |