# Switch [v1.1.31+]

从互斥候选项列表中执行其中一个 Case(实例).

    Switch SwitchValue
    {
    Case CaseValue1:
        Statements1
    Case CaseValue2a, CaseValue2b:
        Statements2
    Default:
        Statements3
    }

## 备注

如果存在, 则对 SwitchValue 进行一次计算并与每个实例值进行比较, 直到找到匹配为止, 然后执行该实例. 否则, 将执行第一个计算为 true(非零和非空) 的实例. 如果没有匹配的实例并且存在 `Default`, 则执行它.

StringCaseSense 控制由 Switch 执行的字符串比较的大小写敏感性.

每个实例最多可以列出 20 个值. 每个值必须是一个表达式, 但可以是一个原义数字, 加引号的字符串或变量. `Case` 和 `Default` 必须以冒号 `:` 终止.

每个实例的第一个语句可以在 `Case` 下面, 也可以在同一行, 挨着冒号. 每个实例都隐式地以下一个 `Case`/`Default` 或右大括号结束. 与在其他一些语言中找到的 switch 语句不同, 没有隐式的落下直通和不使用 Break(除非用于跳出封闭循环).

由于所有实例都包含在同一个块中, 因此在一个实例中定义的标签可以是另一个案例的 Goto 的目标. 但是, 如果标签位于 `Case` 或 `Default` 的正上方, 则它将指向前一个实例的结尾, 而不是下一个实例的开头.

`Default` 不需要列在最后.

## 相关

If (表达式), Else, 区块

## 示例

这是一个有效的热键示例. 在 Input 命令的文档中有一个使用 if-else-if 的功能相同的示例.

    ~[::
    Input, UserInput, V T5 L4 C, {enter}.{esc}{tab}, btw,otoh,fl,ahk,ca
    switch ErrorLevel
    {
    case "Max":
        MsgBox, You entered "%UserInput%", which is the maximum length of text.
        return
    case "Timeout":
        MsgBox, You entered "%UserInput%" at which time the input timed out.
        return
    case "NewInput":
        return
    default:
        if InStr(ErrorLevel, "EndKey:")
        {
            MsgBox, You entered "%UserInput%" and terminated the input with %ErrorLevel%.
            return
        }
    }
    switch UserInput
    {
    case "btw":   Send, {backspace 4}by the way
    case "otoh":  Send, {backspace 5}on the other hand
    case "fl":    Send, {backspace 3}Florida
    case "ca":    Send, {backspace 3}California
    case "ahk":   Run, https://www.autohotkey.com
    }
    return

dftg