Swift初始化含Date属性的Person报错,Date扩展无效求排查解决
问题分析与解决方法
你的代码存在几个关键问题,导致无法正常将字符串转为Date类型并实例化Person对象:
toDate定义为实例方法,但字符串转Date不需要依赖已有Date实例,应该改为静态方法- 参数逻辑完全搞反:你需要传入待转换的日期字符串,而非格式;现在的写法把日期字符串当成格式传入,根本无法正确解析
- 同时设置
dateStyle和dateFormat会冲突,dateFormat会覆盖前者,只需保留dateFormat即可 - 多余的
do-catch块:dateFormatter.date(from:)不会抛出错误,这个代码块完全无效
修正后的Date扩展
extension Date { static func fromString(_ dateString: String, format: String = "dd/MM/yyyy") -> Date? { let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "de_DE") dateFormatter.dateFormat = format return dateFormatter.date(from: dateString) } }
正确实例化Person对象的方式
因为日期转换返回可选类型,需要处理转换失败的情况:
// 方式1:安全的可选绑定 if let birthdayDate = Date.fromString("02/02/1998") { let person = Person(name: "Ania", height: 20, birthday: birthdayDate) } else { print("日期格式错误,转换失败") } // 方式2:强制解包(仅在确认字符串格式绝对正确时使用) let person = Person(name: "Ania", height: 20, birthday: Date.fromString("02/02/1998")!)
更便捷的优化:给Person添加便捷初始化器
如果需要频繁用字符串创建Person,可以给类加一个便捷初始化器,内部自动处理日期转换:
class Person { var name: String var height: Double var birthday: Date init(name: String, height: Double, birthday: Date) { self.name = name self.height = height self.birthday = birthday } // 接收日期字符串的便捷初始化器 convenience init?(name: String, height: Double, birthdayString: String, dateFormat: String = "dd/MM/yyyy") { guard let birthdayDate = Date.fromString(birthdayString, format: dateFormat) else { return nil } self.init(name: name, height: height, birthday: birthdayDate) } } // 使用便捷初始化器 if let person = Person(name: "Ania", height: 20, birthdayString: "02/02/1998") { // 对象创建成功 } else { // 日期转换失败 }
内容的提问来源于stack exchange,提问作者user21913599
相关产品推荐
相关产品推荐

