Swift学習⑤(codebelle)辞書

◆ dictionary

〜まえがき〜

Ios アプリを作成したい(家計簿アプリ、ゲーム)

・比較的簡単らしく、Xcodeがあればすぐに開発をはじめられるのでどんどんやりたい

 ドットインストールにもXcode の使い方(無償)とSwift 入門(有料)があったため 併用していきたい。

 環境xcode 、paiza.io(ブラウザエディタ)

 教材:codebelle、その他webサイト

【本ブログについて】

・codebelle等の講義を参考に自分なりにアレンジしたコードを載せ理解を深めていく。

・又、当ブログは非商用でありcodebelle公式のブログではない。

・《ハック》(改造)は教材での学習のみでは納得できなかった部分について、コードを追加・削除してみたり、オリジナルのコードを作成し試行錯誤してみた箇所。

・《観察》は《ハック》についての考察や、教材もしくはググって参考にした事について、自分なりに理解を深める箇所。

 

◆ dictionary[辞書]、コレクション

ひとつの変数に複数の値を入れられる型の総称=コレクション

コレクションには2 種類ーArray 型[配列]

             ーDictionary 型[辞書]

辞書とはーkey を使って値を扱う

    ー単体のキーと単体の値からなる「要素」を複数もてる

    ー1つの辞書の中に使えるキーは1つだけ

    ーキー・値それぞれに指定できる型は1つずつのみ

 

《観察》

全く意味が分からnai

 

【記述方法1】

var 変数名 = [キー:値,キー:値,キー:値,.....] 
//キーと値はコロン:で区切る。要素と要素カンマ,で区切る//

【例1】

var prices = ["デミオ":120,"イプサム":150,"ストラトス":500]
  //デミオが120 万、イプサムが150 万って感じ//
  //変数prices には、文字列型と数値型の組み合わせの要素が3 組はいっている状態。//
 print(prices)
結果↓
"ストラトス": 500, "イプサム": 150, "デミオ": 120]

 《観察》

なぜ逆に出力された?

コンパイルするたびに順番が変わる。記述した順という規則性はないのか。

 

型を指定する方法...

【記述方法2】

var 変数名:[キーの型:値の型] = [キー:値,キー:値,キー:値,...]

 【例2】

・文字列と数値 

var prices:[String:Int] = ["デミオ":120,"イプサム":150,"ストラトス":500] //※変数と変数型の間はコロン//

・文字列×文字列

var prices:[String:String] = ["デミオ":"かっこいい","イプサム":"かわいい","ストラトス":"すごい"]

・数値×数値

var syohin : [Int:Int] = [1001:120,1002:150,1003:500]

空の辞書を作っておいて後から要素をぶち込むパターン

【記述方法3】

var 配列名:[キーの型:値の型] = [:]

 【例3】例1 を空宣言してみる

var prices:[String:Int] = [:]
//要素を宣言しない場合は型推論できないために、予め型宣言しておく必要がある//

《ハック》

例3 を出力してみる。出力↓

[:]

[]内の:を消して出力してみる。出力↓

コンパイルエラー。

 ◆ 辞書の要素-取り出し方

【記述方法4】

辞書の変数名[インデックス番号]

 【例4】

var prices:[String:Int] = ["デミオ":120,"イプサム":150,"ストラトス":500]
print(prices["イプサム"])
出力↓
Optional(150)

《観察》

辞書から取り出した値がオプショナル型になってしまう...

var prices:[String:Int] = ["デミオ":120,"イプサム":150,"ストラトス":500]
var AAA = prices["オデッセイ"]

とした場合、インデックスオデッセイは存在しないため、AAA にはnil が入ってしまう。

このまま計算にAAA を用いるとエラーが発生してしまう。

これを防ぐため、オプショナル型としてアンラップをしてあげる必要がある

 

【例5】

var prices:[String:Int] = ["デミオ":120,"イプサム":150,"ストラトス":500]
 var AAA = prices["デミオ"]
  print(AAA!)
出力↓
120

《観察》

辞書で扱う値はなぜオプショナル型化してしまうのか。

オプショナルとは何か整理しておく必要がありそう。

参考:↓とっっってもわかりやすい!!

qiita.com

 

◆辞書でcount

【記述方法5】

辞書名.count //キーと値を1 組として数え、組数をカウントしてくれる。//

【例6】

var prices:[String:Int] = ["デミオ":120,"イプサム":150,"ストラトス":500]
 print(prices.count)
出力↓
3

◆ 辞書の要素を変更したいい

イプサムが100 万に値下げ、型落ちか

【記述方法6】

辞書名[キー] = 変更したい内容

 【例7】

var prices:[String:Int] = ["デミオ":120,"イプサム":150,"ストラトス":500]
 prices["イプサム"] = 100
  print(prices["イプサム"]!)
出力↓
100

◆ 辞書に要素を+

辞書に要素を追加した場合、順番は関係ないらしい。やはり。

 【記述方法7】

辞書名[キー] = 追加したい内容

 【例8】

var prices:[String:Int] = ["デミオ":120,"イプサム":150,"ストラトス":500]
 prices["オデッセイ"] = 130
  print(prices)
出力↓
["イプサム": 150, "ストラトス": 500, "デミオ": 120, "オデッセイ": 130]var prices:[String:Int] = ["デミオ":120,"イプサム":150,"ストラトス":500]

 prices["オデッセイ"] = 130
  print(prices)
出力↓
["イプサム": 150, "ストラトス": 500, "デミオ": 120, "オデッセイ": 130]

 《観察》

出力結果の順番は実行環境によって変わるらしい。

そもそも辞書の場合、キ-によって呼び出すことを主目的としているため、順番は重要

はないそう。

 

◆ 辞書から要素を削除

【記述方法8】

辞書名.removeValue(forkey:削除したい要素のキ-) //リムーブバリュー//

【例9】

var prices:[String:Int] = ["デミオ":120,"イプサム":150,"ストラトス":500]
 prices.removeValue(forKey:"デミオ") //Key の「K」は大文字!!//
  print(prices)
出力↓
["ストラトス": 500, "イプサム": 150]

◆ 辞書の要素全てを消す

【記述方法9】

辞書名.removeAl //リムーブオール//

【例10】

var prices:[String:Int] = ["デミオ":120,"イプサム":150,"ストラトス":500]
 prices.removeAll() //()を忘れず!!//
  print(prices)
出力↓
[:]

◆ まとめてすと

【ためになったこと】

var lenght = ["木":171.0,"鉄":165.2,"陶器":180.1]
 var hekin = (lenght["木"]! + lengft["陶器"]!) / 2
  print(hekin)
出力↓
175.55 

この場合、2 行目の除算2 はDouble を宣言していないため整数Int2 とされ、

木+陶器の少数Double と計算できない...と思いきや、除算2 を型推論でDouble と認識し

てくれるらしい。

そのため、 (171.0+180.1)/2.0 として計算されている。

Swift ではなるべくエラーにならないように解釈してくれるそうです。かわいい。