为何EKWeekday传入非法值不返回nil,导致EKRecurrenceDayOfWeek崩溃?
EKWeekday非法值初始化的验证方案
问题背景
EKWeekday是从Objective-C桥接过来的枚举,基于NSInteger实现,因此用超出1-7范围的rawValue初始化时,不会返回nil,但后续用该实例创建EKRecurrenceDayOfWeek会触发“Invalid day number”崩溃。
除直接校验rawValue范围外,可通过以下方式优化验证逻辑:
给EKWeekday添加合法性校验扩展
封装只读属性统一判断枚举值是否合法:extension EKWeekday { var isValid: Bool { rawValue >= 1 && rawValue <= 7 } }使用示例:
let weekDayInt = 10 let weekDay = EKWeekday(rawValue: weekDayInt) guard weekDay?.isValid == true else { return } let recurrence = EKRecurrenceDayOfWeek(weekDay!)给EKRecurrenceDayOfWeek添加安全初始化方法
自定义可失败初始化器,内部完成合法性校验:extension EKRecurrenceDayOfWeek { init?(safeWithWeekday weekday: EKWeekday) { guard weekday.rawValue >= 1 && weekday.rawValue <= 7 else { return nil } self.init(weekday) } }使用示例:
let weekDayInt = 10 let weekDay = EKWeekday(rawValue: weekDayInt) guard let recurrence = EKRecurrenceDayOfWeek(safeWithWeekday: weekDay!) else { return }封装独立的安全转换函数
直接将Int值转换为可选的合法EKWeekday,一步完成校验与转换:func validEKWeekday(from rawValue: Int) -> EKWeekday? { guard rawValue >= 1 && rawValue <= 7 else { return nil } return EKWeekday(rawValue: rawValue) }使用示例:
let weekDayInt = 10 guard let weekDay = validEKWeekday(from: weekDayInt) else { return } let recurrence = EKRecurrenceDayOfWeek(weekDay)
注意
所有方案的核心仍是校验rawValue是否在1-7之间——由于EKWeekday未提供官方合法性校验API(受限于OC枚举的桥接特性),目前没有脱离范围校验的原生验证方式。上述封装仅提升代码复用性与可读性。
内容的提问来源于stack exchange,提问作者Constantin Saulenco
相关产品推荐
相关产品推荐

