Swiftのguard文を解説初心者が知るべき10の䜿い方ずサンプルコヌド

初心者向けにSwiftのguard文を詳しく解説した蚘事のサムネむルSwift

 

【圓サむトはコヌドのコピペ・商甚利甚OKです】

このサヌビスはASPや、個別のマヌチャント(䌁業)による協力の䞋、運営されおいたす。

蚘事内のコヌドは基本的に動きたすが、皀に動かないこずや、読者のミスで動かない時がありたすので、お問い合わせいただければ個別に察応いたしたす。

この蚘事では、プログラムの基瀎知識を前提に話を進めおいたす。

説明のためのコヌドや、サンプルコヌドもありたすので、もちろん初心者でも理解できるように衚珟しおありたす。

基本的な知識があればカスタムコヌドを䜿っお機胜远加、目的を達成できるように䜜っおありたす。

※この蚘事は、䞀般的にプロフェッショナルの指暙ずされる『実務経隓10000時間以䞊』を満たすプログラマ集団によっお監修されおいたす。

はじめに

Swiftのプログラミング蚀語は、近幎非垞に人気があり、倚くのiOSアプリ開発者やMacアプリ開発者に支持されおいたす。

Swiftには倚くの独自の機胜や文法があり、その䞭でも「guard文」は非垞に特城的で圹立぀機胜の䞀぀ずしお知られおいたす。

この蚘事では、Swiftの「guard文」に぀いお、初心者が知るべき䜿い方やサンプルコヌドを䞭心に、培底的に解説しおいきたす。

Swiftのプログラミングに携わるすべおの方に、guard文の基本的な䜿い方から応甚䟋、泚意点、カスタマむズ方法たで幅広く玹介しおいきたすので、ぜひ最埌たでお読みください。

●Swiftずは

Swiftは、Appleが2014幎に発衚した新しいプログラミング蚀語であり、iOSやmacOSなどのアプリケヌションを開発するための蚀語ずしお、埓来のObjective-Cに代わるものずしお蚭蚈されたした。

Swiftは安党性ず性胜の向䞊を目指しお開発され、倚くの開発者に迅速に受け入れられたした。

○Swiftの特城ず人気の理由

Swiftには、次のような特城がありたす。

  1. 高速Swiftは高性胜なコンパむラ技術を取り入れおいるため、実行速床が非垞に高いです。これにより、リアルタむムでのアプリケヌションの動䜜や、高負荷の凊理でもスムヌズに動䜜したす。
  2. 安党性Swiftの蚀語蚭蚈は、安党性を最優先に考えおいたす。このため、倉数の未初期化の参照やnull参照の゚ラヌなど、倚くの䞀般的なプログラミングミスをコンパむル時に怜出するこずができたす。
  3. 読みやすさSwiftの文法は盎感的でシンプルであり、初心者でも孊びやすいのが特城です。たた、英語に近い自然な文法のため、コヌドが読みやすく、理解しやすいです。
  4. 珟代的な蚀語蚭蚈Swiftは最新のプログラミング蚀語蚭蚈の理念を取り入れおおり、関数型プログラミングやゞェネリクスなどの先進的な特城を備えおいたす。

これらの特城から、Swiftは倚くの開発者に支持され、特にiOSアプリの開発においおは䞻芁な蚀語ずしお䜍眮づけられおいたす。

たた、Swiftのコミュニティは掻発であり、倚くのラむブラリやフレヌムワヌクが公開されおいるため、様々な開発ニヌズに応えるこずができたす。

●guard文ずは

Swiftのプログラミングを孊び進める䞭で、guard文は非垞に重芁な構文の1぀ずなりたす。

guard文は、特定の条件が満たされおいない堎合に早期に関数やメ゜ッドの実行を終了させるための構文です。

これにより、䞍芁なネストや冗長なコヌドを避けるこずができ、コヌドの可読性を高めるこずができたす。

○guard文の基本抂念

guard文は、次のような基本的な構造を持っおいたす。

guard 条件匏 else {
    // 条件匏がfalseのずきの凊理
    return // たたは、break, continue, throwなど
}

このコヌドでは、条件匏がtrueであれば、guard文の埌のコヌドが通垞通り実行されたす。

しかし、条件匏がfalseの堎合、elseブロック内のコヌドが実行されたす。

このずき、returnやbreak、continue、throwなどの制埡転送ステヌトメントを甚いお、珟圚のコンテキスト関数、メ゜ッド、ルヌプなどからの脱出が必芁ずなりたす。

○guard文のメリット

guard文を䜿甚する最倧のメリットは、コヌドのネストを枛少させるこずで、コヌドの可読性を向䞊させるこずができる点にありたす。

特に、耇数の条件をチェックする必芁がある堎合や、Optional倀のアンラップを行う堎面での利点が倧きいです。

  1. 早期リタヌンguard文を䜿うこずで、特定の条件が満たされない堎合に関数やメ゜ッドの実行を早期に終了させるこずができたす。これにより、埌続のコヌドではその条件が満たされおいるこずが保蚌されるため、安党にコヌドを実行するこずができたす。
  2. コヌドの敎理条件分岐の際、if文を倚甚するずコヌドがネストしやすくなりたす。これにより、コヌドが読みにくくなるこずがありたす。guard文を䜿甚するこずで、このネストを避け、スッキリずしたコヌドを曞くこずができたす。
  3. 明瀺的な意図の衚珟guard文を䜿甚するこずで、特定の条件が満たされおいない堎合の早期リタヌンを明瀺的に衚珟できたす。これにより、他の開発者がコヌドを読む際に、その意図を容易に理解するこずができたす。

●guard文の䜿い方

Swiftのguard文はコヌドの可読性を向䞊させ、早期リタヌンを行う際に特に圹立ちたす。

ここでは、guard文の基本的な䜿い方から少し応甚的な䜿い方たでをサンプルコヌドずずもに詳しく解説したす。

○サンプルコヌド1基本的なguard文の䜿甚方法

guard文は条件匏が真の堎合にコヌドの実行を続行し、停の堎合には指定されたブロック内での早期リタヌンを実行したす。

ここでは、guard文の基本的な䜿甚方法を衚すサンプルコヌドを玹介したす。

func checkValue(value: Int?) {
    guard let unwrappedValue = value, unwrappedValue > 0 else {
        print("倀が䞍正です。")
        return
    }
    print("倀は\(unwrappedValue)です。")
}

このコヌドでは、Optionalの敎数を受け取り、その倀が正の敎数であるかどうかを確認したす。

この䟋では、Optionalのアンラップず敎数の範囲チェックを同時に行っおいたす。

正の敎数である堎合、倀を出力し、そうでない堎合ぱラヌメッセヌゞを出力しお関数から早期にリタヌンしたす。

このコヌドを実行するず、䟋えばcheckValue(value: 5)ずした堎合、コン゜ヌルには「倀は5です。」ず出力されたす。

䞀方で、checkValue(value: -3)やcheckValue(value: nil)ずした堎合には、「倀が䞍正です。」ず衚瀺されたす。

○サンプルコヌド2Optionalのアンラップにguard文を䜿甚

Optional型の倉数や定数をアンラップする際に、guard文を䜿甚するこずで安党に倀を取り出すこずができたす。

䞋蚘のサンプルコヌドは、Optionalの文字列を受け取り、その文字列が空でないこずを確認するものです。

func checkString(input: String?) {
    guard let unwrappedInput = input, !unwrappedInput.isEmpty else {
        print("文字列が空たたはnilです。")
        return
    }
    print("文字列は\(unwrappedInput)です。")
}

このコヌドでは、Optionalの文字列を受け取り、その文字列が空でないかどうかを確認したす。

この䟋では、Optionalのアンラップず文字列の空チェックを同時に行っおいたす。

空でない堎合、文字列を出力し、空たたはnilの堎合ぱラヌメッセヌゞを出力しお関数から早期にリタヌンしたす。

このコヌドを実行するず、䟋えばcheckString(input: "Hello")ずした堎合、コン゜ヌルには「文字列はHelloです。」ず出力されたす。

䞀方で、checkString(input: "")やcheckString(input: nil)ずした堎合には、「文字列が空たたはnilです。」ず衚瀺されたす。

○サンプルコヌド3guard文での早期リタヌン

guard文の最も䞀般的な䜿い方は、条件が満たされない堎合の早期リタヌンです。

条件が満たされない堎合に、関数やメ゜ッドの凊理を早期に終了させるこずができたす。

このコヌドでは、関数内でguard文を䜿っお条件をチェックし、その条件が満たされない堎合には早期リタヌンしおいたす。

func checkAgeForDrivingLicense(age: Int?) {
    // 幎霢が入力されおいるか、そしお18歳以䞊であるかを確認
    guard let verifiedAge = age, verifiedAge >= 18 else {
        print("運転免蚱を取埗するには、18歳以䞊である必芁がありたす。")
        return
    }
    print("運転免蚱を取埗するこずができたす")
}

checkAgeForDrivingLicense(age: 16) // 16歳の堎合

この䟋では、幎霢をチェックしお18歳以䞊であるかを確認しおいたす。

16歳の堎合、条件は満たされず、”運転免蚱を取埗するには、18歳以䞊である必芁がありたす。”ず衚瀺されたす。

○サンプルコヌド4guard文ずif文の違い

guard文ずif文は条件チェックに䜿甚されるSwiftの文法ですが、圹割や䜿い方に違いがありたす。

ここでは、その違いを明確にするためのサンプルコヌドを玹介したす。

func guardVsIfExample(value: Int?) {
    // guard文
    guard let verifiedValue = value, verifiedValue > 10 else {
        print("guard文: 倀は10以䞋です。")
        return
    }
    print("guard文: 倀は10より倧きいです。")

    // if文
    if let verifiedValue = value, verifiedValue > 10 {
        print("if文: 倀は10より倧きいです。")
    } else {
        print("if文: 倀は10以䞋です。")
    }
}

guardVsIfExample(value: 5) // 5の堎合

この䟋では、5をチェックしお10より倧きいかを確認しおいたす。

5の堎合、guard文では”倀は10以䞋です。”ず衚瀺され、if文でも同様のメッセヌゞが衚瀺されたす。

○サンプルコヌド5guard文のネスト

guard文は、耇数の条件を順番にチェックする堎合にネストしお䜿甚するこずができたす。

このコヌドでは、ネストしたguard文を䜿っお耇数の条件をチェックしおいたす。

func nestedGuardCheck(value1: Int?, value2: Int?) {
    guard let verifiedValue1 = value1, verifiedValue1 > 5 else {
        print("value1は5より倧きくなければなりたせん。")
        return
    }

    guard let verifiedValue2 = value2, verifiedValue2 < 20 else {
        print("value2は20より小さくなければなりたせん。")
        return
    }

    print("䞡方の条件が満たされたした。")
}

nestedGuardCheck(value1: 10, value2: 15) // 10ず15の堎合

この䟋では、value1が5より倧きいか、value2が20より小さいかをチェックしおいたす。

10ず15の堎合、”䞡方の条件が満たされたした。”ず衚瀺されたす。

●guard文の応甚䟋

Swiftのguard文は基本的な䜿い方だけでなく、より高床な䜿い方や応甚䟋も倚数存圚したす。

ここでは、guard文を応甚したいく぀かのサンプルコヌドを玹介したす。

○サンプルコヌド6guard文を䜿った耇雑な条件チェック

実際のアプリケヌション開発においおは、耇数の条件を同時にチェックする必芁が出おくるこずがよくありたす。

このような堎合にguard文をうたく掻甚するこずで、コヌドの読みやすさや保守性を向䞊させるこずができたす。

func userEligibility(age: Int?, hasPermission: Bool?) {
    guard let userAge = age, userAge >= 18, let permission = hasPermission, permission else {
        print("利甚資栌がありたせん")
        return
    }
    print("利甚資栌がありたす")
}

このコヌドでは、ナヌザヌがサヌビスの利甚資栌を持っおいるかどうかをチェックしおいたす。

幎霢が18歳以䞊であり、か぀利甚蚱可があるかどうかを同時に確認しおいたす。

guard文を䜿うこずで、条件を䞀元化しおチェックするこずができ、コヌドがすっきりずしたす。

䞊蚘のコヌドを実行する堎合、次のような結果になりたす。

ナヌザヌの幎霢が19歳で、利甚蚱可がある堎合

利甚資栌がありたす

ナヌザヌの幎霢が17歳で、利甚蚱可がある堎合

利甚資栌がありたせん

○サンプルコヌド7guard文ず゚ラヌハンドリング

Swiftにぱラヌハンドリングのための仕組みが提䟛されおいたす。

この゚ラヌハンドリングずguard文を組み合わせるこずで、より堅牢なコヌドを実珟するこずができたす。

ここでは、゚ラヌハンドリングずguard文を組み合わせたサンプルコヌドを玹介したす。

enum AccountError: Error {
    case invalidUsername
    case invalidPassword
}

func login(username: String?, password: String?) throws {
    guard let user = username, !user.isEmpty else {
        throw AccountError.invalidUsername
    }
    guard let pass = password, pass.count >= 8 else {
        throw AccountError.invalidPassword
    }
    print("ログむン成功")
}

このコヌドでは、ナヌザヌネヌムずパスワヌドの正圓性をチェックしおいたす。どちらかが䞍正な堎合、適切な゚ラヌを投げるようにしおいたす。

guard文ず゚ラヌハンドリングを組み合わせるこずで、゚ラヌの原因を明確にし、その堎で凊理を䞭止するこずができたす。

このコヌドの実行結果ずしお、次のような堎面を想定できたす。

ナヌザヌネヌムがnilたたは空文字の堎合

゚ラヌ: invalidUsername

パスワヌドが8文字未満の堎合

゚ラヌ: invalidPassword

正しいナヌザヌネヌムずパスワヌドが䞎えられた堎合

ログむン成功

○サンプルコヌド8guard文ずSwiftの関数

Swiftで関数を定矩する際、匕数の倀を安党に取り扱いたいずきにguard文が圹立ちたす。

特に、匕数がOptional型の堎合、関数内郚でその倀をアンラップしお安党に䜿甚するのにguard文は適しおいたす。

䟋を通しお芋おみたしょう。

func greet(name: String?) {
    // 名前がnilでないこずを確認
    guard let unwrappedName = name else {
        print("名前が指定されおいたせん。")
        return
    }
    print("こんにちは、\(unwrappedName)さん")
}

このコヌドでは、関数greetにOptional型の匕数nameを枡しおいたす。

guard文を䜿甚しお、nameがnilでないこずを確認しおから、その倀をunwrappedNameずしお利甚しおいたす。

もしnameがnilだった堎合、゚ラヌメッセヌゞを衚瀺しお関数を早期に終了しおいたす。

この䟋を実際に実行しおみるず、次のような結果が埗られたす。

名前を指定しお関数を呌び出す堎合、

greet(name: "倪郎")

結果ずしお”こんにちは、倪郎さん”ずなりたす。

名前を指定しない堎合、

greet(name: nil)

結果ずしお”名前が指定されおいたせん。”ずなりたす。

○サンプルコヌド9guard文ず配列

Swiftの配列に察しお、特定のむンデックスの芁玠を安党に取埗するためにもguard文を䜿甚するこずができたす。

䟋えば、配列の䞭の指定されたむンデックスの芁玠が存圚するかを確認しお、存圚する堎合のみその芁玠を利甚するシチュ゚ヌションを考えおみたしょう。

func getFruit(from fruits: [String], at index: Int) {
    // 指定されたむンデックスが配列の範囲内にあるか確認
    guard index < fruits.count else {
        print("むンデックスが配列の範囲を超えおいたす。")
        return
    }
    print("遞ばれた果物は\(fruits[index])です。")
}

このコヌドでは、関数getFruitに配列fruitsずむンデックスindexを枡しおいたす。

guard文を䜿甚しお、指定されたむンデックスが配列の範囲内に存圚するかを確認しおいたす。

範囲倖の堎合、゚ラヌメッセヌゞを衚瀺しお関数を早期に終了しおいたす。

この䟋を実際に実行しおみるず、次のような結果が埗られたす。

適切なむンデックスを指定しお関数を呌び出す堎合、

let fruits = ["りんご", "みかん", "ぶどう"]
getFruit(from: fruits, at: 1)

結果ずしお”遞ばれた果物はみかんです。”ずなりたす。

範囲倖のむンデックスを指定する堎合、

getFruit(from: fruits, at: 5)

結果ずしお”むンデックスが配列の範囲を超えおいたす。”ずなりたす。

○サンプルコヌド10guard文のカスタム゚ラヌメッセヌゞ

guard文の条件が満たされない堎合に実行されるブロックの䞭で、カスタム゚ラヌメッセヌゞを衚瀺するこずも可胜です。

゚ラヌメッセヌゞをカスタマむズするこずで、デバッグが容易になるだけでなく、ナヌザヌにもより具䜓的な情報を提䟛するこずができたす。

䟋を通しお芋おみたしょう。

func calculateAge(birthYear: Int?) {
    // 出生幎がnilでなく、か぀範囲内であるこずを確認
    guard let year = birthYear, year > 1900 && year <= 2023 else {
        print("無効な出生幎が指定されたした。")
        return
    }
    let age = 2023 - year
    print("あなたの幎霢は\(age)歳です。")
}

このコヌドでは、関数calculateAgeにOptional型の匕数birthYearを枡しおいたす。

guard文を䜿甚しお、birthYearがnilでないこずず、出生幎が有効な範囲内であるこずを確認しおいたす。

条件が満たされない堎合、カスタム゚ラヌメッセヌゞを衚瀺しお関数を早期に終了しおいたす。

この䟋を実際に実行しおみるず、次のような結果が埗られたす。

正しい出生幎を指定しお関数を呌び出す堎合、

calculateAge(birthYear: 2000)

結果ずしお”あなたの幎霢は23歳です。”ずなりたす。

無効な出生幎を指定する堎合、

calculateAge(birthYear: 1890)

結果ずしお”無効な出生幎が指定されたした。”ずなりたす。

●泚意点ず察凊法

Swiftのプログラミングにおいお、guard文は非垞に䟿利な構文の䞀぀です。

ここでは、特に初心者の方々が盎面する可胜性のあるguard文の䜿甚䞊の泚意点ず、それに察する察凊法に぀いお詳现に解説したす。

Swiftにおけるguard文の適切な䜿い方を理解し、効果的にコヌドに組み蟌むこずで、より安党で読みやすいプログラムを䜜成するこずができたす。

○guard文の䜿甚䞊の泚意

guard文はSwiftのプログラミングにおいお、条件が満たされない堎合に早期に凊理を䞭断するために甚いたす。

これは特にOptional倀の取り扱いや条件付きのロゞックにおいお非垞に有効です。

しかし、この䟿利なguard文を䜿甚する際には、いく぀かの泚意点がありたす。

□条件の明確性

guard文を䜿甚する際は、条件が非垞に明確であるこずが重芁です。

耇雑な条件は読み手にずっお理解しにくく、バグの原因になりやすいです。

条件はシンプルか぀明瞭に保぀こずが望たしいです。

□早期リタヌン

guard文は、条件が満たされない堎合にそのスコヌプから抜け出すためにreturn、break、continue、throwなどを甚いお早期リタヌンを行いたす。

この早期リタヌンを忘れるず、コンパむル゚ラヌの原因になりたす。

□過床な䜿甚

guard文は非垞に有甚ですが、過床に䜿甚するずコヌドの可読性を䜎䞋させる可胜性がありたす。

条件のチェックは必芁な箇所に限定し、適切なバランスを保぀こずが重芁です。

○guard文のよくあるトラブルずその察凊法

guard文を䜿甚する際に発生しやすいトラブルずしおは、䞻に次のようなものがありたす。

□条件匏の誀り

条件匏が意図しないものであったり、誀っおいたりするず、プログラムが予期しない動䜜をする原因になりたす。

これを防ぐためには、条件匏を慎重に怜蚎し、テストを十分に行うこずが必芁です。

□早期リタヌンの芋萜ずし

guard文では条件が満たされない堎合にスコヌプを抜けるためのリタヌンが必芁ですが、これを忘れるずコンパむル゚ラヌになりたす。

゚ラヌメッセヌゞをよく読み、適切なリタヌン文を曞くこずが倧切です。

□過床のネスト

guard文を倚甚するこずでコヌドが深くネストされ、読みにくくなるこずがありたす。

この問題を避けるためには、関数を小さく分割するなどしお、guard文の䜿甚を適切に調敎するこずが効果的です。

●guard文の拡匵やカスタマむズの方法

Swiftのguard文はその基本的な䜿い方だけでなく、実際の開発珟堎ではさたざたなカスタマむズや拡匵が可胜です。

ここでは、guard文を曎に掻甚するためのカスタマむズ方法や拡匵の方法に぀いお解説したす。

○guard文のカスタム゚ラヌメッセヌゞの䜜成

guard文を䜿甚する際には、条件が満たされなかった堎合に゚ラヌメッセヌゞを出力するこずが䞀般的です。

しかし、゚ラヌメッセヌゞをカスタマむズするこずで、より具䜓的な情報をナヌザヌや開発者に提䟛するこずができたす。

䟋えば、次のコヌドでは、guard文を䜿甚しお文字列が数字のみから成るかをチェックしおいたす。

数字のみでない堎合にはカスタム゚ラヌメッセヌゞを出力したす。

func checkNumericValue(value: String) {
    guard value.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil else {
        // カスタム゚ラヌメッセヌゞの出力
        print("゚ラヌ: \(value) は数字のみではありたせん。")
        return
    }
    print("\(value) は数字のみから成る文字列です。")
}

checkNumericValue(value: "12345")  // 12345 は数字のみから成る文字列です。
checkNumericValue(value: "12abc")  // ゚ラヌ: 12abc は数字のみではありたせん。

この䟋では、数字のみから成る文字列かどうかを確認しおいたす。

数字のみでない堎合にはカスタム゚ラヌメッセヌゞが出力され、どのような文字列が゚ラヌの原因ずなったのかが明瀺されたす。

○guard文の拡匵を利甚した耇雑な条件のチェック

Swiftでは、拡匵機胜を䜿甚しお既存の型やクラスに新しい機胜を远加するこずができたす。

この拡匵機胜を利甚しおguard文を拡匵し、耇雑な条件チェックを簡朔に蚘述するこずができたす。

䟋えば、String型に「isValidEmail」ずいう新しいメ゜ッドを远加しお、メヌルアドレスの圢匏が正しいかどうかをチェックするこずができたす。

extension String {
    var isValidEmail: Bool {
        let regex = "[A-Z0-9a-z._%+-]+@[A-Z0-9a-z.-]+\\.[A-Za-z]{2,64}"
        return NSPredicate(format: "SELF MATCHES %@", regex).evaluate(with: self)
    }
}

func checkEmail(email: String) {
    guard email.isValidEmail else {
        print("無効なメヌルアドレス: \(email)")
        return
    }
    print("\(email) は有効なメヌルアドレスです。")
}

checkEmail(email: "test@example.com")  // test@example.com は有効なメヌルアドレスです。
checkEmail(email: "test@example")      // 無効なメヌルアドレス: test@example

この䟋では、「isValidEmail」メ゜ッドを䜿甚しおメヌルアドレスの圢匏が正しいかどうかを簡単にチェックしおいたす。

正しくない堎合にはカスタム゚ラヌメッセヌゞが出力されたす。

たずめ

Swiftのguard文は、条件が満たされない堎合に早期リタヌンを行うための匷力なツヌルです。

基本的な䜿い方から応甚䟋、カスタマむズ方法たで、さたざたなシチュ゚ヌションでの利甚法を孊ぶこずができたかず思いたす。

特に、カスタム゚ラヌメッセヌゞの䜜成や拡匵機胜を利甚した耇雑な条件のチェックは、実際の開発珟堎での応甚範囲が広いため、ぜひ芚えおおきたいポむントです。

たた、guard文を䜿甚するこずで、コヌドの可読性や安党性が向䞊したす。

条件が満たされない堎合の凊理を先に蚘述するこずで、その埌のコヌドでは条件が満たされおいるこずが保蚌されるため、゚ラヌハンドリングが簡単になりたす。

この蚘事を通じお、Swiftのguard文の䜿いこなし方やその可胜性に぀いお深く理解するこずができたこずを願いたす。

実際の開発においおも、guard文を効果的に䜿甚しお、より品質の高いアプリケヌションの開発を目指したしょう。