无法在 swift 中检查具有“null”值的开关案例

Unable to check Switch cases with "null" value in swift

提问人:Swift 提问时间:6/6/2022 更新时间:6/6/2022 访问量:463

问:

检查我正在使用的多个条件switch statements

代码:这里所有情况都工作正常,但是。如果user_details?.rating = “” 是空的,那么我需要显示默认大小写,我的意思是所有星星都是空的,但它会进入 case _,user_details在哪里?。额定值??“” <= “1.9” 为什么?

如果我强制解包,那么应用程序在到达此位置时会崩溃case _ where (user_details?.rating)! <= "1.9":

user_details?.rating = “” 那么如何显示所有星星为空

请指导我

switch user_details?.rating{

case "1.0":

    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")
break
case _ where user_details?.rating ?? "" <= "1.9":

    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")
break

case "2.0":

    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")

 break

case _ where user_details?.rating ?? "" <= "2.9":

    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")
 break


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")

break

}
ios swift null switch-statement

评论

3赞 Joakim Danielson 6/6/2022
我建议转换为 Double 并在您的案例中使用范围rating
0赞 udi 6/6/2022
比较两个字符串时,将比较它们的 unicode 值。所以返回.您可以做的是使用额外的条件,例如"" <= "1.9"trueuser_details?.rating ?? "" <= "1.9" && user_details?.rating ?? "" != ""
0赞 udi 6/6/2022
您也可以将其作为双精度进行比较let starCount = Double(user_details?.rating) ) ?? 0
1赞 vadian 6/6/2022
无关,但这是 Swift。s 末尾没有语句(也没有丑陋的snake_case名称)。breakcase

答:

1赞 Timmy 6/6/2022 #1

应用程序崩溃了,因为你基本上是说:这个属性持有一个不是的值,如果我错了,应用程序就会崩溃force unwrappinguser_details?.rating

尝试在 switch 语句之前安全地解包:user_details?.rating

  1. 用:if let

    if let rating = user_details?.rating {
    }else {
    }
    
  2. 用:guard let

    guard let rating = user_details?.rating else {
        return
    }
    
  3. 提供默认值:

    let rating = user_details?.rating ?? ""
    

然后,您的代码将如下所示:

guard let rating = user_details?.rating else {
    //do something if it is nil
    return
}

switch rating {
case "1.0":
    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")
    break
case _ where user_details?.rating ?? "" <= "1.9":
    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")
    break
case "2.0":
    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")
    break
case _ where user_details?.rating ?? "" <= "2.9":
    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")
    break
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")
    break
}