swift – 覆盖一个计算属性,该属性返回一个Optional值,返回一个
发布时间:2020-12-14 05:01:10 所属栏目:百科 来源:网络整理
导读:以下编译和运行在运行 Swift 4的Xcode 9.2上没有问题: class ParentWithComputedOptional { var computedOptional: Int? { return nil }}class ChildThatUnwraps: ParentWithComputedOptional { override var computedOptional: Int { return 10 }} 请注意,
以下编译和运行在运行
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关键字.这在Playground和一个合适的项目上进行了测试. 这是预期的行为吗?如果是,Apple方案文档中是否有针对此方案的相关页面? 解决方法
这种特殊的覆盖情况似乎没有在官方语言指南中的任何地方记录,但在Swift的
changelog版本中提到了4.0版本(寻找SR-1529).
本主题值得一些额外的信息: 实际上,此行为不仅限于选项,还适用于其他covariant类型,只要重写的属性是派生类中的计算只读属性即可. class Animal {} class Koala: Animal {} class Foo { var x: Animal { return Animal() } } class Bar: Foo { override var x: Koala { return Koala() } } 这是一个不违反Liskov substitution principle的边缘情况,因为Base类的属性是只读的计算属性.因此,如果Bar的实例被保存在Foo类型的变量中,则无法改变其x属性,以便在将对象向下转换为Bar类型的变量时创建类型错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |