Swift:创建实例前如何检查存储属性(以Employee类为例)
如何确保Employee实例的入职日期晚于出生日期?
嘿,这个需求其实很好实现,我们只需要把校验逻辑放在类的自定义初始化器里就可以了——毕竟初始化器是创建类实例的必经之路,在这里做合法性检查能从源头阻止不合法的实例被创建。
具体实现思路:
- 给
Employee类添加一个自定义的指定初始化器,把所有存储属性的初始化逻辑集中在这里 - 在初始化属性之前,先判断
startWorkDate是否大于birthdayDate(因为Date遵循Comparable协议,直接用>运算符就行) - 如果校验不通过,就触发你需要的
fatalError;如果通过,再完成属性赋值
完整代码示例:
import Foundation class Employee { var name: String var birthdayDate: Date var startWorkDate: Date // 自定义指定初始化器 init(name: String, birthdayDate: Date, startWorkDate: Date) { // 先执行合法性校验 guard startWorkDate > birthdayDate else { fatalError("错误:入职日期必须晚于出生日期!") } // 校验通过后,再给存储属性赋值 self.name = name self.birthdayDate = birthdayDate self.startWorkDate = startWorkDate } // 如果你需要其他初始化方式(比如便利初始化器),也可以在这里扩展 // 比如带更多属性的初始化器,只要在内部调用这个指定初始化器即可 }
可选优化:用更友好的错误处理方式
如果你觉得fatalError直接崩溃太激进,也可以改用可失败初始化器,这样创建实例时会返回Optional类型,你可以优雅地处理不合法的情况:
import Foundation class Employee { var name: String var birthdayDate: Date var startWorkDate: Date init?(name: String, birthdayDate: Date, startWorkDate: Date) { guard startWorkDate > birthdayDate else { return nil } self.name = name self.birthdayDate = birthdayDate self.startWorkDate = startWorkDate } } // 使用示例 let validEmployee = Employee(name: "John", birthdayDate: Date(timeIntervalSince1970: 600000000), startWorkDate: Date()) if validEmployee != nil { print("创建合法员工实例成功") } else { print("创建失败:入职日期不合法") }
内容的提问来源于stack exchange,提问作者Volodymyr
相关产品推荐
相关产品推荐

