🙆

【DAY5】100 Days of SwiftUI -if, switch, and the ternary operator

2022/12/31に公開

はじめに

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

学んだこと

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

if文

一般的な言語と同じような文法で書ける。<, =<, ==, !=, &&, || 等のオペレーターも一般的な言語と同じ。三項演算子も同様。

let score = 85

if score > 80 {
    print("Great job!")  // 条件を満たすのでこっちが出力される
}
else {
    print("Next time!")
}

Swiftの文字列について

Swiftは絵文字等を含む複雑な文字列をサポートしているので文字列のチェックが遅い。たとえば文字列が空であるかを判定するとき最も単純な方法は以下である。この方法は基本的にどの言語でも遅い。

// usernameが空の場合"Anonymous"を代入する
if username == "" {
    username = "Anonymous"
}

そのため以下のようにcountを使えば早くなるのが一般的だがSwiftはこれでも遅い。

if username.count == 0 {
    username = "Anonymous"
}

SwiftではisEmptyというものが用意されているのでそれを使うのが早い。

if username.isEmpty {
    username = "Anonymous"
}

It's over 9000!

海外で「It's over 9000!」というネットミームがあるらしい。ドラゴンボールZのベジータのセリフがもとになっている。日本でいう「君のような勘のいいガキは嫌いだよ」、「だが断る」のような漫画・アニメのセリフがもとのネット上でよく使われる言葉のイメージ。

数や量が計算できないほど大きいものを表現するときに使われるのが一般的であるが、デモチベーターや荒らしの素材として使われることもある。
(Wikipedia -It's Over 9000!)

if, else if, elseの使い方の流れで登場。

In case you were wondering, yes this does mean we’ll be relying on the Dragonball Z meme.
(訳)念のため言っておくと、そう、これはドラゴンボールZのミームに頼ることになる。

let score = 9001

if score > 9000 {
    print("It's over 9000!")
} else if score == 9000 {
    print("It's exactly 9000!")
} else {
    print("It's not over 9000!")
}

Switch文

基本的には他の言語のSwitch文と同じだが、以下の2点が特殊である。

  1. 全てのパターンを網羅的に書くか、他のどれにもマッチしなかった場合の"default"を入れる必要がある。抜けがある場合はエラーが発生する。
  2. 上から判定していきどれかのパターンにマッチした時点で処理を終わる(breakは不要)。そのため、defaultは一番下に設置する必要がある。
let place = "Metropolis"

switch place {
case "Gotham":
    print("You're Batman!")
case "Mega-City One":
    print("You're Judge Dredd!")
case "Wakanda":
    print("You're Black Panther!")
default:
    print("Who are you?")
}

ほとんど使う機会はないが、意図的に次のcaseも判定したいとき(2.のルールを無視したいとき)はfallthroughを使う。例えば英語圏で有名な「The Twelve Days of Christmas(※)」の歌詞の再現を試みる。
(※)クリスマスの12日前から毎日プレゼントをもらうストーリーの曲。12日前はOOをもらった→11日前はOOをもらった→10日前はOOをもらった→...の形式。Wikipedia -クリスマスの12日間

fallthroughを使わない場合は特定の言葉しか表示できない。

let day = 5
print("My true love gave to me…")

switch day {
case 5:
    print("5 golden rings")  // ここだけ表示される
case 4:
    print("4 calling birds")
case 3:
    print("3 French hens")
case 2:
    print("2 turtle doves")
default:
    print("A partridge in a pear tree")
}

fallthrouを使うとカウントダウン?の形式で意図した表示が可能。

let day = 5
print("My true love gave to me…")

// case 5からdefaultまでprintが実行される
switch day {
case 5:
    print("5 golden rings")
    fallthrough
case 4:
    print("4 calling birds")
    fallthrough
case 3:
    print("3 French hens")
    fallthrough
case 2:
    print("2 turtle doves")
    fallthrough
default:
    print("A partridge in a pear tree")
}

Discussion