【経緯】
社内もくもく会にてSwiftが始まったので復習がてら。この記事のpart2です。
【基礎構文】
■配列
/* 配列の宣言 */
var numbers:[String] = ["1", "2", "3"]
/* 配列に要素を追加 */
numbers.append("8")
■for
/* 配列の宣言 */
var numbers:[String] = ["1", "2", "3"]
/* 配列に要素を追加 */
numbers.append("8")
/* 配列の要素数分繰り返す */
for numStr in numbers {
print("配列の中身は\(numStr)です")
}
配列の中身は1です
配列の中身は2です
配列の中身は3です
配列の中身は8です
/* 繰り返し範囲の指定 */
let baseNumber:Int = 7
/* 1~9を繰り返す */
for number in 1...9 {
let result:Int = baseNumber * number
print("\(baseNumber) * \(number) = \(result)")
}
7 * 1 = 7
7 * 2 = 14
7 * 3 = 21
7 * 4 = 28
7 * 5 = 35
7 * 6 = 42
7 * 7 = 49
7 * 8 = 56
7 * 9 = 63
■辞書
/* 辞書を定数に代入する方法 */
/* let 定数名: [キーのデータ型: 値のデータ型] = 辞書 */
let user : [String: String] = ["name" : "swift", "email" : "test@test.com"]
print(user["name"])
Optional("swift")
/* 辞書を変数で宣言 */
var user: [String: String] = [
"name": "Suzuki",
"email": "suzuki@example.com"
]
user["name"] = "Sato"
print(user["name"])
user["hobby"] = "soccer"
print(user["hobby"])
Optional("Sato")
Optional("soccer")
■Optional
前にSwiftやった時はこの辺がわけわからん過ぎて何となくで流してました。
Optionalは「nil」が許容される型という意味らしいです。
「nil」というのは何もない状態。ポインタとして何も指してない事を表し、実体がない、という状態。
ポインタとして何も指してない、という観点だと「nil」「Nil」「NULL」が有りますが、それぞれ以下の違いがあります。
語句 | 内容 |
---|---|
nil:(id)0 | オブジェクトを何も指していない |
Nil:(Class)0 | クラスを何も指していない |
NULL:void * | ポインタを何も指していない |
通常のデータ型に「?」をつけることで表現されます。通常のデータ型の他に「nil」を代入することが出来ます。
■アンラップ
Optionalの末尾に「!」をつけることでOptionalの値を参照できる(通常時は参照できない)。
ただし、Optionalはnilを許容する型なので、nilでないことをチェックせずに案ラップすると中身がnilである可能性が発生する。
nilなOptionalの値にアンラップするとエラーが発生するので、絶対にnilではないと判断できる場合以外はnilチェックを行ってからアンラップをすること。
訳が分からなかった時期に取りあえずXcodeに導かれるまま「?」「!」を駆使するとデバッグで地獄を見ることになったのは記憶に新しい。
let user: [String: String] = [
"name": "swift",
"email": "swift@example.com"
]
if user["name"] != nil {
let name:String = user["name"]!
print(name)
}
swift
■オプショナルバインディング
Optionalがnilでないことをチェックし、アンラップして取り出すというパターンはswiftで良く発生します。
そこで、そのパターンを簡単に記述出来るようにした構文がオプショナルバインディング。
オプショナルバインディングを使用した記載では、アンラップを明示的に記載する必要がありません。
if let name:String = user["name"] {
} else {
// nilの場合の処理
}
■型推論
代入する値によってデータ型が明確になる場合に、型宣言を省略できる構文。最近流行りの言語はこれが出来ることが多い。
if let name = user["name"] {
/* true */
} else {
/* false */
}
【所感】
個人的にちゃんと理解出来ていなかったOptionalの理解が出来たのは結構大きいかなと思います。前にアプリ作った時は納期の関係とか周りにやったことある人が居なかったりとかで、開発した人のいないアプリからコピペ&ググって問題解決していた関係上、ちゃんとは理解出来ていなかったです。nilを許容する型とかその辺くらいでした。
オプショナルバインディングは何度も見たことあるんですが、ぱっと見で「何だこれ」ってなるので毎回意識的に避けてました。めっちゃ便利だった。
辞書(連想配列)とか型推論は最近流行りの言語は結構兼ね備えているような気がしますが、昔は受け入れられなかったです。初めてPHPでサーバーサイドプログラミングした時が懐かしい……。
【参考】
・https://qiita.com/tomohisaota/items/9df0b93442a7ee37fe1f・
・https://www.itcowork.co.jp/blog/?p=939
・https://www.dorapro.co.jp/engineerblog/?p=512
・https://www.itcowork.co.jp/blog/?p=939