Swift"h"必须绑定在每个模式错误中 - 切换问题

use*_*499 4 pattern-matching switch-statement swift

switch语句中的这个错误的原因是什么?"h必须绑定在每个模式中"?

我基本上试图将h用作小时变量,确保它不是nil(因为小时最初是一个可选值,然后看它是否大于17).我知道我在某个地方做错了什么,但那个讨厌的小'必须在每个模式中绑定'错误是什么?

谢谢

let date = NSDate()
let calendar = Calendar.current
let components = calendar.dateComponents([.hour], from: date as Date)
let hour = components.hour


switch hour {
case let h, (h as Int) != nil, h >= 17:
    return true
default:
    return false        
}
Run Code Online (Sandbox Code Playgroud)

OOP*_*Per 8

你可能需要写这样的东西:

switch hour {
case let h? where h >= 17:
    return true
default:
    return false

}
Run Code Online (Sandbox Code Playgroud)

或者,如建议的那样,使用if声明:

if let h = hour, h >= 17 {
    return true
} else {
    return false
}
Run Code Online (Sandbox Code Playgroud)

或者,简单地说:

return hour != nil && hour! >= 17
Run Code Online (Sandbox Code Playgroud)

在此模式中经常会出现错误消息:

enum MyEnum {
    case patternA(Int)
    case patternB(Int)
    case patternC
}

let me = MyEnum.patternB(30)

switch me {
case .patternA(let h), .patternB(let h), .patternC: //<-
    print("A or B with h, or C")
default:
    print("this may never happen")
}
Run Code Online (Sandbox Code Playgroud)


cat*_*ore 6

当我遇到同样的错误时我尝试了这个:

case .something, .other(let parameter) where parameter != nil:
     doSomething()
Run Code Online (Sandbox Code Playgroud)

我认为,Swift 5 无法处理如此复杂的表达式,所以我不得不将其拆分:

case .something:
     fallthrough
case .other(let parameter) where parameter != nil:
     doSomething()
Run Code Online (Sandbox Code Playgroud)

检查Fallthrough 运算符参考以获取更多详细信息,但它基本上用于继续执行到下一个情况