見出し画像

今でしょ!Swift - ブール、タプル、オプショナル

基本的な便利機能です。

ブール値

Swift は、Bool と呼ばれる基本的なブール値を持っています。ブール値は、真(true)か偽(false)のみを値として取ることから、論理値(logical)として参照されます。Swift では true と false の 2 つのブールの定数を提供しています。

まず

let orangesAreOrange = true
let turnipsAreDelicious = false

と定義しておき、これを使って判別をします。"if"を使った条件分岐です。

if turnipsAreDelicious {
    print("Mmm, tasty turnips!")
} else {
    print("Eww, turnips are horrible.")
}

turnipsAreDeliciousは"false"と定義しているのでif文のelseが選択され、

"Eww, turnips are horrible."

が出力されます。この場合はturnipsAreDeliciousの真偽(ブール値)で判定しています。

if文で比較をする場合に気を付けることとしては、比較する場合は

let i = 1
if i == 1 {
    // コンパイルできます
}

とすること、

if i == 1

比較は"=="を使うことに注意します。これを使うことで同じであるかどうかというブール値にすることができます。

タプル

タプル(Tuples)は、複数の値を 1 つのまとまりにグループ化します。

配列、辞書などでもひとまとめにすることができますがもっと制約少なく簡単に使うことができます。

タプル内の値にはどんな型も入れることができ、全ての型を同じにする必要はありません。

let http404Error = (404, "Not Found")

この例示は数字と文字が一緒にまとめてあります。

タプルは、任意の順序で、異なる任意の型を組み合わせることができます。例えば、(Int, Int, Int) や (String, Bool) 型のタプルも作ることができますし、必要に応じて順番の入れ替えも可能です。

こんなこともできます。

let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
print("The status message is \(statusMessage)")

変数を2つ同じく定義してそれぞれで出力しています。

必要なければアンダースコアを使って無効にできます。

let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")

片方はアンダースコアの定数(以下)を使って

let (justTheStatusCode, _)

インデックスによる呼び出し。

print("The status code is \(http404Error.0)")

"http404Error.0"は変数http404Errorのインデックス0番目なので、定義されているタプルから

(404, "Not Found")

インデックは頭から0,1・・・とついているので"0"番目は"404"ということになります。

The status code is 404

と出力されることになります。

値に名前をつけることもできます。

let http200Status = (statusCode: 200, description: "OK")

その名前を使用して各値へアクセスができます。

print("The status code is \(http200Status.statusCode)")

statusCodeは"200"なので、"The status code is 200"と出力されます。 descriptionだと"OK"と出ます。


オプショナル

オプショナルは、値が存在しないかもしれないときに使用します

String を Int へ変換するイニシャライザの例。

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)

// convertedNumber の型は 「Optional<Int>」

nil

オプショナルな変数は、特別な値 nil を代入することで、値のない状態を設定することができます

var serverResponseCode: Int? = 404
// serverResponseCode Int の値の 404 を含んでいます

serverResponseCode = nil
// serverResponseCode は 値を含んでいません

このオプショナル値と非オプショナル値を区別することで、どの情報が欠如しているか明示的にマークすることができ、欠如している値を取り扱うコードを書くのが簡単になります。オプショナル値を非オプショナル値として誤って扱うことはできません。なぜなら、このようなミスはコンパイル時にエラーを生成するからです。値をアンラップした後、その値を利用する他のコードは nil のチェックをする必要がなくなるため、コードの異なる部分で同じ値を何度もチェックする必要がありません。

オプショナルは特別な値となるので使う時にはアンラップの操作が必要になります。

・nil のときに値を操作するコードをスキップする
・nil の値を伝播させるには、nil を返すか ?? 演算子を使用します。
・?? 演算子を使用して、デフォルト値を使えるようにします。
・! 演算子を使用して、強制的に使えるようにします。


この記事が気に入ったらサポートをしてみませんか?