1. ホーム
  2. swift2

[解決済み】Swiftのガードキーワード

2022-04-14 21:17:09

質問

Swift 2 では guard キーワードを使用することで、様々なデータをすぐに設定できるようにすることができました。私が見た例では 本サイト は、submitTapped関数のデモです。

func submitTapped() {
    guard username.text.characters.count > 0 else {
        return
    }

    print("All good")
}

を使うのはどうなんだろうと思っています。 guard は、昔ながらの方法である if という条件があります。単純なチェックでは得られない利点があるのでしょうか?

解決方法は?

読み方 この記事 を使うことで、大きな効果があることに気づきました。 ガード

ここでは、guardの使い方を例題で比較します。

こちらはガードなしの部分です。

func fooBinding(x: Int?) {
    if let x = x where x > 0 {
        // Do stuff with x
        x.description
    }

    // Value requirements not met, do something
}

  1. ここでは、すべての条件の中に希望のコードを入れています。

    しかし、ステートメントを実行する前にすべての条件を満たす必要がある多数の条件がネストされている場合、どれほど混乱するか想像できるかもしれません。

これをきれいにする方法は、まずそれぞれのチェックを行い、どれかが満たされない場合は終了することです。これにより、どのような条件でこの関数が終了するのかが容易に理解できるようになります。

しかし、今はガードを使うことができ、いくつかの問題を解決することが可能であることがわかります。

func fooGuard(x: Int?) {
    guard let x = x where x > 0 else {
        // Value requirements not met, do something
        return
    }

    // Do stuff with x
    x.description
}

<ブロッククオート
  1. 必要な条件ではなく、必要な条件をチェックすること。これもアサートと似ている。条件を満たさない場合 guardのelse文が実行され、関数から抜け出る。
  2. 条件を満たした場合は、オプション変数が自動的にアンラップされます。 文が呼び出されました。この場合、fooGuard(_:) 関数が呼び出されました。
  3. 悪いケースを早期にチェックし、関数をより読みやすく、保守しやすくしています。

これと同じパターンは、非選択的な値にも当てはまります。

func fooNonOptionalGood(x: Int) {
    guard x > 0 else {
        // Value requirements not met, do something
        return
    }

    // Do stuff with x
}

func fooNonOptionalBad(x: Int) {
    if x <= 0 {
        // Value requirements not met, do something
        return
    }

    // Do stuff with x
}

まだご不明な点がある場合は、記事全体をお読みください。 Swiftのガード声明。

ラップアップする

そして最後に、読んでテストしてわかったのは、optionalをすべてunwrapするためにguardを使用する場合です。

ラップされていない値は、他の部分で使用するために残ります。 コードブロック

.

guard let unwrappedName = userName else {
    return
}

print("Your username is \(unwrappedName)")

ここでは、ラップされていない値は、if ブロックの内部でのみ使用できます。

if let unwrappedName = userName {
    print("Your username is \(unwrappedName)")
} else {
    return
}

// this won't work – unwrappedName doesn't exist here!
print("Your username is \(unwrappedName)")