Swift switch判断rating空值未进入默认分支问题求解
问题原因
- 空字符串匹配异常:直接用字符串做大小比较时,遵循字典序比较规则(逐位对比字符ASCII值),空字符串
""的优先级低于所有非空字符串,必然满足"" <= "1.9"的判断条件,因此不会进入default分支。这种写法还存在隐藏逻辑bug:评分值为"10.0"时,字符串比较会判定"10.0" < "1.9"(第一位字符同为"1",第二位字符"0"的ASCII值小于"9"),判断结果完全错误。 - 强制解包崩溃:当
user_details为nil,或其rating属性为nil时,user_details?.rating的返回值是nil,对nil值做强制解包!会直接触发运行时崩溃。
修复方案
核心修正两点:
- 前置拦截所有异常场景:把
nil、空字符串、非数字格式的评分值统一归类到全空星级的展示逻辑 - 把评分从字符串转为
Double类型做数值比较,彻底规避字符串字典序比较的逻辑错误
修复后的代码如下:
// 前置校验:过滤空值、非法格式值 guard let ratingStr = user_details?.rating, let rating = Double(ratingStr) else { // 所有异常场景统一展示全空星级 star1.image = UIImage(named: "staremp") star2.image = UIImage(named: "staremp") star3.image = UIImage(named: "staremp") star4.image = UIImage(named: "staremp") star5.image = UIImage(named: "staremp") return } // 基于数值做区间判断,逻辑准确无歧义 switch rating { case 1.0..<1.5: star1.image = UIImage(named: "star") star2.image = UIImage(named: "staremp") star3.image = UIImage(named: "staremp") star4.image = UIImage(named: "staremp") star5.image = UIImage(named: "staremp") case 1.5..<2.0: star1.image = UIImage(named: "star") star2.image = UIImage(named: "star-half") star3.image = UIImage(named: "staremp") star4.image = UIImage(named: "staremp") star5.image = UIImage(named: "staremp") case 2.0..<2.5: star1.image = UIImage(named: "star") star2.image = UIImage(named: "star") star3.image = UIImage(named: "staremp") star4.image = UIImage(named: "staremp") star5.image = UIImage(named: "staremp") case 2.5..<3.0: star1.image = UIImage(named: "star") star2.image = UIImage(named: "star") star3.image = UIImage(named: "star-half") star4.image = UIImage(named: "staremp") star5.image = UIImage(named: "staremp") // 可按相同区间规则补全3分、4分、5分的对应分支 default: star1.image = UIImage(named: "staremp") star2.image = UIImage(named: "staremp") star3.image = UIImage(named: "staremp") star4.image = UIImage(named: "staremp") star5.image = UIImage(named: "staremp") }
内容的提问来源于stack exchange,提问作者Swift
相关产品推荐
相关产品推荐

