You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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值做强制解包!会直接触发运行时崩溃。
修复方案

核心修正两点:

  1. 前置拦截所有异常场景:把nil、空字符串、非数字格式的评分值统一归类到全空星级的展示逻辑
  2. 把评分从字符串转为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 20:54:18