Swift类可选属性初始化赋值失败问题求助
为啥你的
middleName始终是nil?问题出在这! 嘿,我一眼就瞅到问题所在啦!你在初始化器里给middleName赋值的方式错了,导致这个变量根本没被正确设置。
核心错误:误用可选链赋值
你写了:
self.middleName? = middleName
这里的?是Swift的可选链操作符,它的逻辑是:只有当middleName当前不为nil的时候,才会执行后面的赋值操作。但刚初始化的时候,middleName作为可选类型默认值就是nil,所以这条赋值语句直接被跳过了——相当于你啥都没给它赋值,那它当然一直是nil啦!
正确的赋值方式
因为middleName本身就是String?类型,直接正常赋值就行,完全不需要加?:
self.middleName = middleName
额外优化:让初始化器更贴合可选设计
另外,你把middleName声明为可选类型,但初始化器却要求必须传入这个参数,这有点矛盾。如果middleName是可选的,建议把初始化器的对应参数也设为可选(带默认值),这样调用者可以选择传或者不传,更符合可选类型的设计初衷:
init(firstName: String, middleName: String? = nil, lastName: String) { self.firstName = firstName self.middleName = middleName self.lastName = lastName }
修正后的完整代码示例
var firstName: String var middleName: String? var lastName: String init(firstName: String, middleName: String? = nil, lastName: String) { self.firstName = firstName self.middleName = middleName self.lastName = lastName } func getFullName() -> String { guard let middle = middleName else { return "\(firstName) \(lastName)" } return "\(firstName) \(middle) \(lastName)" }
这样修改后,middleName就能正常接收你传入的值,在getFullName()里也能正确判断啦!
内容的提问来源于stack exchange,提问作者decipher
相关产品推荐
相关产品推荐

