Swift中遵循只读属性协议的结构体未赋值无报错?求解原因
Swift结构体遵循协议时未初始化属性却无报错的原因
先看你给出的第一段代码:
protocol Named { var name: String { get } } protocol Aged { var age: Int { get } } struct Person: Named, Aged { var name: String var age: Int }
这段代码里Person只声明了属性类型没给初始值,但编译器不报错,核心原因是Swift的结构体默认会自动生成成员逐一构造器。
当你不给结构体属性设置默认值时,编译器会自动帮你创建一个构造器,要求你创建Person实例时必须传入name和age的值来初始化这两个属性,比如必须像这样写:
let person = Person(name: "Alice", age: 30)
这种情况下,实例的属性在创建时就被完全初始化了,完全满足Named和Aged协议里只读属性的要求——协议的{ get }只要求属性能被读取,并不强制必须有默认值,只要确保实例被使用时属性已经有合法值就行。
再看你给出的第二段代码:
protocol Named { var name: String { get } } protocol Aged { var age: Int { get } } struct Person: Named, Aged { var name: String = "Steeve" var age: Int = 20 }
这段是给属性加了默认值,此时创建实例可以不用传参数(直接用默认值),也可以传参数覆盖默认值,本质上和第一段代码都是合法的,只是初始化方式不同而已。
总结一下:你忽略了Swift结构体的自动成员逐一构造器机制,它保证了未设置默认值的属性会在实例创建时被外部传入的值初始化,不会出现属性未初始化的情况,因此编译器不会报错。
内容的提问来源于stack exchange,提问作者Suojae
相关产品推荐
相关产品推荐

