Swift属性初始化报错Cannot use instance member 'month',如何生成日期对应整数?
解决Swift中"Cannot use instance member within property initializer"错误
你碰到的这个报错其实是Swift的基础规则在起作用:类或者结构体里的实例属性初始化器会在self实例完全创建好之前运行,这时候直接引用month、day这类其他实例属性是不被允许的——毕竟self都还没成型,没法安全访问它的成员。
给你三种实用的修复方案,你可以根据自己的需求选:
方案1:用懒加载属性(lazy var)
懒加载的属性会在第一次被访问时才初始化,这时候self已经完全可用了,自然就能安全引用其他实例属性:
import Foundation class YourClass { let day = Calendar.current.component(.day, from: Date()) let month = Calendar.current.component(.month, from: Date()) // 用lazy修饰,第一次访问时才计算值 lazy var todaysDate: Int = self.month * 100 + self.day }
结构体里也可以用同样的写法哦。
方案2:把日期属性改成静态属性
如果day和month不需要和实例绑定,只是全局通用的当前日期,那把它们设为static静态属性就可以直接用了——静态属性属于类型本身,不依赖self实例:
import Foundation class YourClass { static let day = Calendar.current.component(.day, from: Date()) static let month = Calendar.current.component(.month, from: Date()) // 直接引用静态属性,不需要self var todaysDate = month * 100 + day }
⚠️ 注意:静态属性只会初始化一次,要是你的类实例会在不同日期创建,这个日期值不会自动更新,适合只需要一次获取当前日期的场景。
方案3:在初始化方法里设置值
如果需要每次创建实例都获取最新的日期,把所有属性的初始化放到init方法里是最严谨的——而且还能避免两次调用Date()可能带来的微小时间差(比如刚好在午夜前后,两次Date()可能跨天):
import Foundation class YourClass { let day: Int let month: Int var todaysDate: Int init() { let currentDate = Date() self.day = Calendar.current.component(.day, from: currentDate) self.month = Calendar.current.component(.month, from: currentDate) self.todaysDate = month * 100 + day } }
内容的提问来源于stack exchange,提问作者Nebraska2Texas
相关产品推荐
相关产品推荐

