🎱

【DAY8】100 Days of SwiftUI -default values, throwing functions

2023/01/02に公開

はじめに

iOSアプリ界隈で(たぶん)有名なPaul Hudsonさんが無料で公開しているSwiftUIの100日学習コースを進めてみます。学習記録及び備忘録がてらにつらつらと書いてみます。
100 Days of SwiftUI

学んだこと

序盤はSwiftUIは関係なくSwiftという言語の言語仕様のお話。気になった点だけピックアップ。

関数にデフォルト値を設定する

以下のように関数にデフォルト値を設定した場合、引数を省略できる。

func printTimesTables(for number: Int, end: Int = 12) {
    for i in 1...end {
        print("\(i) x \(number) is \(i * number)")
    }
}

printTimesTables(for: 5, end: 20)
printTimesTables(for: 8)

エラーハンドリング

Swiftでは以下の3ステップでエラーハンドリングを行う。他にも方法はあるが型通りなのは以下と思われる。ただし、Swiftではthrow関数を設定した関数を呼び出す場合直前にtryを置かなければならずややこしいため初学者はthrow関数を使わない方がよいとの考えが記載されていた。

  1. 起こりうるエラーを列挙する
  2. エラーが発生した場合にフラグを立てる関数を作る
  3. その関数を呼び出し、起こりうるエラーを処理する

例えばパスワードの強度を判定する処理を考える。パスワードが短い場合(5桁未満)や緩すぎる場合にエラーを返す設定。

1. 起こりうるエラーを列挙する

enum PasswordError: Error {
    case short, obvious
}

2. エラーが発生した場合にフラグを立てる関数を作る

関数の定義時にthrowsを入れ、処理の中にthrowを書くことでエラー発生時のフラグを作成している。下記の例で言うと、パスワードが短い場合のエラーフラグをthrow PasswordError.shortで作成している。また、関数はthrowが実行された時点で終了する。

func checkPassword(_ password: String) throws -> String {
    if password.count < 5 {
        throw PasswordError.short
    }
    
    if password == "12345" {
        throw PasswordError.obvious
    }
    
    if password.count < 8 {
        return "OK"
    } else if password.count < 10 {
        return "Good"
    } else {
        return "Excellent"
    }
}

3.その関数を呼び出し、起こりうるエラーを処理する

try-catchで処理。

let string = "12345"

do {
    let result = try checkPassword(string)
    print("Password rating: \(result)")
} catch PasswordError.short {
    print("Please use a longer password.")
} catch PasswordError.obvious {
    print("I have the same combination on my luggage!.")
} catch {
    print("There was an error.")
}

// 出力: Please use a longer password.

Discussion