> For the complete documentation index, see [llms.txt](https://zenofchain.gitbook.io/sway-bian-cheng-yu-yan-geng-xin-zhong-the-sway-programming-languageupdatin/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://zenofchain.gitbook.io/sway-bian-cheng-yu-yan-geng-xin-zhong-the-sway-programming-languageupdatin/4.-sway-yu-yan-ji-chu-sway-language-basics/4.9-kong-zhi-liu-control-flow.md).

# 4.9 控制流 (Control Flow)

### `if` 表达式 (`if`expressions)

Sway supports *if*, *else*, and *else if* expressions that allow you to branch your code depending on conditions.

Sway 支持 *if*、*else* 和 *else if* 表达式，允许你根据条件分支代码。

For example:\
例如：

```
fn main() {
    let number = 6;

    if number % 4 == 0 {
        // do something
    } else if number % 3 == 0 {
        // do something else
    } else {
        // do something else
    }
}

```

#### 在 `let` 语句中使用 `if` (Using `if` in a `let` statement)

Like Rust, `if`s are expressions in Sway. What this means is you can use `if` expressions on the right side of a `let` statement to assign the outcome to a variable.

与 Rust 一样，`if` 是 Sway 中的表达式。这意味着您可以在 `let` 语句的右侧使用 `if` 表达式将结果分配给变量。

```
let my_data = if some_bool < 10 { foo() } else { bar() };

```

Note that all branches of the `if` expression must return a value of the same type.

请注意，`if` 表达式的所有分支都必须返回相同类型的值。

#### `match` 表达式 （`match` expressions)

Sway supports advanced pattern matching through exhaustive `match` expressions. Unlike an `if` statement, a `match` expression asserts **at compile** time that all possible patterns have been matched. If you don't handle all the patterns, you will get compiler error indicating that your `match` expression is non-exhaustive.

Sway 通过详尽的`match 匹配`表达式支持高级模式匹配。与 `if` 语句不同，`match` 表达式断言在编译时\*\*所有可能的模式都已匹配。如果您不处理所有模式，您将收到编译器错误，表明您的`match 匹配`表达式是非穷尽的。

The basic syntax of a `match` statement is as follows:

`match` 语句的基本语法如下：

```
let result = match expression {
    pattern1 => code_to_execute_if_expression_matches_pattern1,
    pattern2 => code_to_execute_if_expression_matches_pattern2,
    pattern3 | pattern4 => code_to_execute_if_expression_matches_pattern3_or_pattern4
    ...
    _ => code_to_execute_if_expression_matches_no_pattern,
}

```

Some examples of how you can use a match statement:

有关如何使用匹配语句的一些示例：

```
script;

// helper functions for our example
fn on_even(num: u64) {
    // do something with even numbers
}
fn on_odd(num: u64) {
    // do something with odd numbers
}

fn main(num: u64) -> u64 {
    // Match as an expression
    let is_even = match num % 2 {
        0 => true,
        _ => false,
    };

    // Match as control flow
    let x = 12;
    match x {
        5 => on_odd(x),
        _ => on_even(x),
    };

    // Match an enum
    enum Weather {
        Sunny: (),
        Rainy: (),
        Cloudy: (),
        Snowy: (),
    }
    let current_weather = Weather::Sunny;
    let avg_temp = match current_weather {
        Weather::Sunny => 80,
        Weather::Rainy => 50,
        Weather::Cloudy => 60,
        Weather::Snowy => 20,
    };

    let is_sunny = match current_weather {
        Weather::Sunny => true,
        Weather::Rainy | Weather::Cloudy | Weather::Snowy => false,
    };

    // match expression used for a return
    let outside_temp = Weather::Sunny;
    match outside_temp {
        Weather::Sunny => 80,
        Weather::Rainy => 50,
        Weather::Cloudy => 60,
        Weather::Snowy => 20,
    }
}

```

### 循环 (Loops)

#### `while`

Loops in Sway are currently limited to `while` loops. This is what they look like:

Sway 中的循环目前仅限于`while`循环。他们看起来像这样：

```
while counter < 10 {
    counter = counter + 1;
}

```

You need the `while` keyword, some condition (`value < 10` in this case) which will be evaluated each iteration, and a block of code inside the curly braces (`{...}`) to execute each iteration.

您需要 `while` 关键字、每次迭代都会评估的某些条件（在本例中为 `value < 10`），以及花括号内的代码块（`{...}`）来执行每次迭代。

#### `break` 和 `continue` （`break` and `continue`）

`break` and `continue` keywords are available to use inside the body of a `while` loop. The purpose of the `break` statement is to break out of a loop early:

`break` 和 `continue` 关键字可在 while 循环体内使用。 `break` 语句的目的是尽早跳出循环：

```
fn break_example() -> u64 {
    let mut counter = 1;
    let mut sum = 0;
    let num = 10;
    while true {
        if counter > num {
            break;
        }
        sum += counter;
        counter += 1;
    }
    sum // 1 + 2 + .. + 10 = 55
}

```

The purpose of the `continue` statement is to skip a portion of a loop in an iteration and jump directly into the next iteration:

`continue` 语句的目的是跳过迭代中的一部分循环并直接跳转到下一次迭代：

```
fn continue_example() -> u64 {
    let mut counter = 0;
    let mut sum = 0;
    let num = 10;
    while counter < num {
        counter += 1;
        if counter % 2 == 0 {
            continue;
        }
        sum += counter;
    }
    sum // 1 + 3 + .. + 9 = 25
}

```

#### 嵌套循环 (Nested loops)

You can also use nested `while` loops if needed:

如果需要，您还可以使用嵌套的 `while` 循环：

```
while condition_1 == true {
    // do stuff...
    while condition_2 == true {
        // do more stuff...
    }
}

```
