XcodeのPlaygroundを使ってSwiftの練習をする続編です。
基本的に必要最小限なことしか書いていない(書けていない)ので、各項目についてより詳細に理解したい場合には、それぞれウェブ検索して他の入門編やハンズオン資料などを参照ください
#1. 辞書(Dictionary)について
- 辞書(dictionary)では独自の識別子(キー)を使用して要素を扱うことができます。似ている機能として配列がありますが、配列では要素は添え字(インデックス)の値でしか扱えませんでした
- playgroundに下記を書いて実行結果を確認してみます。出力結果の「Optional」についてはのちほど説明します
var dict:[String:String] = [
"氏名" : "丸の内太郎",
"住所" : "東京都千代田区丸の内1丁目",
"国籍" : "日本"
]
print(dict["住所"])
- これを配列で書くと下記のようになりますが、何番めに何の要素が入っていたかを覚えている必要があり不便な場合がありますね
var dict:[String] = ["丸の内太郎","東京都千代田区丸の内1丁目","日本"]
print(dict[1])
- 予め格納する要素の型がわからない、もしくはなんでも入れられるようにしたい、という場合、Anyで定義します(ちなみに配列の定義でもAnyは使用可能です)
var dict:[String:Any] = [
"氏名" : "丸の内太郎",
"住所" : "東京都千代田区丸の内1丁目",
"国籍" : "日本",
"年齢" : 35
]
print(dict["住所"])
print(dict["年齢"])
**練習:**商品名:りんご、産地:青森、価格:200(整数)を格納するdictionaryを作成し、任意の要素を出力してみましょう。同様の内容(キー情報なし)を配列でも作成して要素を出力してみましょう
#2. タプル(tuple)について
- タプル(tuple)では複数の型の異なる要素をまとめることができます。記述も()で括るだけで簡単です
- 配列や辞書(dictionary)では型に制約があったりしましたね(それ自体は決して悪いことではありませんが、「わかっている」人にとってはめんどくさかったりするので。。)
- playgroundに下記を書いて実行結果を確認してみます。
var dict = ("丸の内太郎", "東京都千代田区丸の内1丁目", "日本", 35 )
print(dict.2)
print(dict.3)
練習: 先ほど辞書で練習した例をタプルで記述してためしてみましょう
#3. オプショナル型について
- おっと、ついに出ましたね。?と!の話です。ちょっとややこしいですががんばって理解してください
- playgroundに下記を書いて実行結果を確認してみます。
var a:Int
print(a)
- コンパイル時には問題ない(エラーにならない、赤いエラー表示は出ない)ですが、実行するとエラーになってしまいますね。「変数aが初期化されないうちに使われた」とデバッグ欄で怒られてしまっています
- この変数aを使用するには初期化してからでないと使えない(この例ではprintできない)ですね
var a:Int = 0
print(a)
- ただ、場合によっては事前に値が用意できない場合もあります。そのような要素は「値なし」(nil、といいます)可能、として扱う事が可能です。値なし(nil)可能な変数を「オプショナル型」と呼びます。変数の定義の際に「?」を付けて宣言します
var a:Int?
print(a)
- 上記の例では、変数aはオプショナル型として宣言されているので、初期化しなくてもprint文で使用可能です。結果は「nil」(値なし)と出力されています
- オプショナル型は、元の型をラップ(wrap、包み込む)します。そのため値が無く(nil)ても扱うことができます。言い換えると、中身が空の変数をラップして扱えるようにしている、ということになります
- 同様に、変数の宣言の際に「!」を付加してオプショナル型として宣言することもできます(意味は後述します)
- ここで注意が必要なのは、これらの「?」や「!」は式の途中で使用されているものとは意味が異なるという点です。変数の定義の際に使用される「?」や「!」のみオプショナル型の宣言の意味を持ちます(式の途中で使用される「?」や「!」については後述します)
- オプショナル型では、初期化しなくても要素が使えてしまうため、うっかりすると中身がない(nil)まま扱ってしまう危険があるので注意が必要です
- オプショナル型の変数に値を代入すると以下のように出力されます
var a:Int?=0
print(a)
- 単なる「0」ではなく「Optional(0)」と表示されているのは、値が0の変数aをラップ(包み込んで)している、ということを意味します
- 下記を実行してみます
var a:Int? = 1
var b:Int = 2
print(a+b)
- エラーになり実行できません。これは変数aがオプショナル型として宣言されているため、整数値1はラップされていてそのままでは変数bが持つ整数値2と加算できない、ということを表します
- 上記を演算可能にするためには、変数aを包みから取り出す必要があります。包み(ラップ)から取り出すのでアンラップ、と言います。アンラップにはいくつか方法がありますが、まず変数aを強制的にアンラップする「強制アンラップ」という方法をご紹介します。強制アンラップには演算時に「!」をつけます。変数の定義時に付加する「!」(このあと説明します)とは意味が異なるので注意します
var a:Int? = 1
var b:Int = 2
print(a!+b)
- 無事、計算ができました。これはオプショナル型変数aを強制アンラップ(a!)して取り出した整数値1を変数bの整数値2と加算した、ということになります
- まあ、いいんですが、毎回強制アンラップするのは気がひけるというか、めんどくさいので、オプショナル型を宣言する際に、「必要に応じてアンラップしてね」と宣言することができます。これが変数定義時に付加する「!」です
var a:Int! = 1
var b:Int = 2
print(a+b)
- 今度は、演算時にオプショナル型変数aに何もしなくても「必要に応じて」アンラップされ整数値1が取り出され、変数bの整数値2と加算されることができました。前項との違いはオプショナル型変数aの定義の際に「!」を付加している点で、このオプショナル型変数定義時に付加される「!」は、のちの変数使用時に必要に応じてアンラップしてもらうようにする、という定義となります。このようなオプショナル型を「暗黙的アンラップ型」(Implicitly Unwrapped Optional)と呼びます
- オプショナル型のアンラップ(包みから値を取り出す)の仕方は、他にオプショナル・バインディングやオプショナル・チェイニングなどもあるので見てみてください
- あーややこしかったですね。おつかれさまでした。