Swift 可选的 case where 语句

Swift optional in case where statement

前几天参加一个课程,其中一位服务员尝试了一些东西,结果发现了一个有趣的错误。

当打开值为 nil 的案例时,这如何提供结果?

func canDrink(age: Int?, country: String)->bool{
    switch (age, country){
    case (let anAge, _) where anAge < 5: //playground still says anAge is an optional
        return false
    default:
        return true
    }
}
canDrink(15,"UK")  // Returns true
canDrink(4,"UK")   // Returns false
canDrink(nil,"UK") // Also returns false not an error.

干杯

更新

根据您的评论提供更多背景信息。与可选的比较没有任何无效:

var d: Int? = 4
if d < 5 {} // true

并且如果可选值是 nil,它仍然是一个真实值:

var d: Int? = nil
if d < 5 {} // still true

这是为什么?好吧,nil 值字面意思是 .None (if .None < 5)(见下文),在这种情况下 5 肯定大于 .None.

原创

这里的问题是 let anAge 是一个可选的 Int(正如您所指出的)。如果你检查它,你会看到这个(图片供参考):

如果您查看可选定义,您会看到一个选项是一个具有两种类型(NoneSome)的枚举。所以我们可以检查 Some 以确保它有一个值:

func canDrink(age: Int?, country: String) -> Bool {
    switch (age, country) {
    case (.Some, _) where age < 5: // We now know that `age` is some value
        return false
    default:
        return true
    }
}

canDrink(15,"UK")  // Returns true
canDrink(4,"UK")   // Returns false
canDrink(nil,"UK") // Now returns true, since this is a `.None` age