
変数・定数についてはすでに基本的なことは学習済みですが、新たな気づきがあったらココに記録しておきます。
fa-chevron-circle-right型の確認にはtype(of:)関数が使える
1 2 3 4 5 |
var x = 10 var y = "x" For Selected Ltem type(of:x) //Int.Type type(of:y) //String.Type |
この関数を使わなくても変数を選択して[help]→[Show Quick Help For Selected Item]からも確認可。
また、「オプションキー」+「コマンドキー」+「2キー」で常に右ペインにQuick Helpを表示できる。
fa-chevron-circle-right明示的な型変換
比較演算子(==/!=/</>など)や算術演算子(+/-/*など)は数値の型が一致するときのみ利用できるが、型が違っても明示的な型変換を行えば使える
1 2 3 4 5 |
let a: Float = 123.0 let b: Double = 123.0 a == b //コンパイルエラー a == Float(b) //true |
fa-chevron-circle-right複数行の文字数リテラル
複数行にまたがる文字列は、「"""」で囲む。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
let tateyomi = """ "た" "て" "よ" "み" """ print(tateyomi) /* "た" "て" "よ" "み" */ |
fa-chevron-circle-rightString型とCharacter型の結合
append(_:)メソッドで可能。
1 2 3 4 5 6 7 |
var a: String = "abc" let b: Character = "d" a.append(b) print(a) //"abcd" |
fa-chevron-circle-right辞書の要素の削除
任意の要素にnilを代入。
1 2 3 4 5 |
var dic = ["d1": 1, "d2": 2] dic["d2"] = nil print(dic) //["d1": 1] |
fa-chevron-circle-right辞書(Dictionary<Key,Value>型)のValue型には配列を入れることもできる
1 |
let xxx = ["even": [1, 2, 3, 4], "odd": [5, 6, 7]] |
目次
配列の要素の更新/追加/結合/削除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//追加 var x = [1, 2, 3] x.append(4) print(x) //[1, 2, 3, 4] //任意の位置に追加 var y = [1, 2, 4] y.insert(3, at: 2) print(y) //[1, 2, 3, 4] //削除 var z = [1, 2, 0, 3, 4] z.remove(at: 2) print(z) //[1, 2, 3, 4] /*最後の要素はremovelast() 全ての要素はぺremoveAll()で削除*/ |
範囲型(Range)とは
Rangeとは、主に値の下限と上限の範囲を指定する閉区間「下限…上限」と、不等式を用いて評価を行う開区間「下限..<上限」を指定し、値の評価を行います。
1 2 3 4 5 6 |
//書き方1:閉区間 let 変数名 = 下限値…上限値 //書き方2:開区間 let 変数名 = 下限値..<上限値 |
「...演算子」(閉区間)
1 2 3 4 5 6 7 8 9 10 |
let range30 = 1...30 print(range30.contains(0)) //false print(range30.contains(1)) //true print(range30.contains(7)) //true print(range30.contains(30)) //true print(range30.contains(31)) //false a |
..<演算子(開区間)
1 2 3 4 5 6 7 8 9 10 |
let range30 = 1..<30 print(range30.contains(0)) //false print(range30.contains(1)) //true print(range30.contains(7)) //true print(range30.contains(30)) //false print(range30.contains(31)) //false a |
Optional<Wrapped型>
値があるか、空かのいずれかを返す型。nilを許容する必要がある場合に使用する。Optional
値の取り出し方
Optional<Wrapped型>の値に対する操作を行うには、値を取り出す必要があります。これをアンラップといいます。
fa-chevron-circle-right3種のアンラップ
・オプショナルバインディング
if-let文を使って値を取り出します。右辺にOptional
if-let文は値の有無に応じて分岐を行い、値が存在する場合には値の取り出しも同時に行います。
値があるときは{}内の処理を実行し、nilならスキップします。
nilの場合に実行したい処理があれば、else節を追加しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
let xxx = Optional("a") //String?型 if let yyy = xxx { print(yyy) } //出力:a let xxx = Optional(1) if let yyy = xxx { print("値は\(yyy)です") } else { print("値が存在しません") } //出力:値は1です print(yyy)//エラー //if let文で宣言した定数のスコープはif{}内のみ。 //右辺に複数の値を持たすこともできる。二つの変数共に値を持っていた場合のみ、if{}内の処理が実行される。 let aaa: Int? = Optional(1) let bbb: Int? = nil if let ccc = aaa, let ddd = bbb { print("値は\(ccc)と\(ddd)です") } else { print("値が存在しません") } //値が存在しません |
・??演算子
Optional
「??」は左辺にOptional
左辺のOptional
つまり、左辺に値がない場合は右辺の値がデフォルトになるということです。
1 2 3 4 5 6 7 8 9 10 11 12 |
let xxx: Int? = 1 let yyy = xxx ?? 3 print(yyy) //出力:1 let xxx: Int? = nil let yyy = xxx ?? 3 print(yyy) //出力:3 |
・強制アンラップ(!)
!演算子を使いOptional
1 2 3 4 |
let xxx: Int? = 5 let yyy: Int? = 3 xxx! + yyy! //8 |
オプショナルチェイン
アンラップを伴わずにWrapped型のプロパティやメソッドにアクセスする方法。
オプショナルチェーンを通してアクセスされたプロパティやメソッドは、Optional
Optional
1 2 3 4 5 |
let xxx = Optional(0...10) let yyy = xxx?.contains(30) //xxx = optional型の式 / contains(30) = プロパティ名等 print(String(describing: yyy)) //出力:Optional(false) //optional型を返す |
暗黙的アンラップ
Optional
同じように「Wrapped!」とも表記できます。これを暗黙的アンラップといいます。
これによって生成された値はアクセス時に自動的に強制アンラップされます。
「Wrapped?」も「Wrapped!」も同じOptional
1 2 3 4 5 6 7 |
let xxx: Int? = 5 let yyy: Int! = 3 print(type(of: xxx)) print(type(of: yyy)) /*Optional<int> Optional<int>*/</int></int> |
1 2 3 4 5 6 |
let xxx: Int! = 3 xxx + 2 //5 let yyy: Int! = nil yyy + 2 //エラー |
値の存在が明らか、または値が無ければプログラムを終了させたい時に使いましょう。
型のキャスト
変数や定数の型をより汎用的に扱えるようにすること。Any型の変数をInt型として扱ったりできる。
fa-chevron-circle-right型の判定
ある値の型が特定の型か調べるには中置演算子「is」を使う。
左辺に検証対象の式、右辺に検証したい型を取ります。
1 2 |
let xxx: Any = 1 let yyy = xxx is Int //true |
アップキャスト
階層の下位を上位の型として扱う操作。中置演算子「as」を使用。
しかし、アップキャストは常に成功するため暗黙的に行える。asも省略可。
1 2 3 |
let xxx = 1 as Any //Int型をAny型にアップキャスト(省略せずに書いたバージョン) let xxx: Any = 1 //Int型をAny型に暗黙的にアップキャスト(省略バージョン) |
ダウンキャスト
階層の上位となる型を下位の型として扱う操作。失敗することもあります。
fa-chevron-circle-rightas?中置演算子
左辺の値を右辺の型へダウンキャストします。
ダウンキャストできたらOptional
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
let xxx = 1 as Any //Int型をAny型にアップキャスト(省略せずに書いたバージョン) let yyy = xxx as? Int //Optioinal(1) let yyy = xxx as? String//nil //if let分の右辺でダウンキャストをすると、型による条件分岐を安全に行える。 let xxx: Any = 1 //Int型をAny型に暗黙的にアップキャスト(省略バージョン) if let yyy = xxx as? Int { //if let分の右辺でダウンキャスト print("値はInt型の\(yyy)です") } //出力:値はInt型の1です |
fa-chevron-circle-right強制キャスト(中置演算子as!)
左辺の値を右辺の型へダウンキャストし 、失敗時は実行時エラーとなります。(成功した場合しかプログラムの実行を継続できない)
結果はWrapped型が返ります。
1 2 3 |
let xxx = 1 as Any //Int型をAny型にアップキャスト(省略せずに書いたバージョン) let yyy = xxx as! Int //1 let yyy = xxx as! String//実行時エラー |
as?の方が安全だが、as!の方が簡単。基本的にはas?を使い、明らかに失敗しない時などにはas!を使おう。
用語まとめ
fa-chevron-circle-right糖衣構文(=シンタックスシガー)
複雑でわかりにくい書き方と全く同じ意味になるよりシンプルでわかりやすい書き方で書くこと。
fa-chevron-circle-right2次元配列
配列を要素にもつ配列のこと。
fa-chevron-circle-right初期化
変数や定数への最初の代入を初期化という。
fa-chevron-circle-right論理演算子
真理値(true, false)に対する演算。Bool型には否定(前置演算子!)、論理積(中間演算子&& かつ)、論理和(中間演算子|| または)の3つの論理演算子があります。