読者です 読者をやめる 読者になる 読者になる

citron syrup

HTML,CSS,js,Ruby,Swift

辞書(dictionary)

前回は配列の記事を書いた

f:id:CitronCockatiel:20160117175227p:plain

var cockatiel = ["もふもふ","とさか","ほっぺ"] 
print(cockatiel[0]) //ଘ(ㆁvㆁ)<表示結果はもふもふ

上記の様に配列の宣言がすぐ近くにあれば内容を確認できるが、配列の宣言と要素の取り出しが離れている場合、事前に内容を把握することが困難である。
この問題を解決するために用意されているのが辞書という機能。
辞書(dictionary)とは、添字に整数以外の型を指定できる配列である。

人の年齢を登録する辞書の宣言

var age = ["ろん":19, //ଘ(ㆁvㆁ)<ろんは19歳
           "はっぴーりょう":32, //ଘ(ㆁvㆁ)<はっぴーりょうは32歳
           "ゆーたむちー":20] //ଘ(ㆁvㆁ)<ゆーたむちーは20歳

年齢を変更し、その要素を取り出す

age["はっぴーりょう"] = 23 //ଘ(ㆁvㆁ)<はっぴーりょうは(心は)23歳

新たにというキーを作成し、その値を20にする

age["ちなっちゃん"] = 20 //ଘ(ㆁvㆁ)<ちなっちゃんは20歳という要素を追加する

また、辞書の要素を消去する場合は以下のようにnilという特殊な値を指定する。
このnilとは、プログラムにおいて何も値がないという状態を表す特殊な値である。

ろんの要素を消去する

age["ろん"] = nil //ଘ(ㆁvㆁ)<ろんという要素を消去する

次は関数です。

配列(array)

配列(array)とは、複数のデータを1つにまとめて管理する機能である。
配列は変数の一種で、宣言する際にその変数をデータを1つだけ格納できる変数にするのか、データを複数格納できる配列にするのかを決定する。

var cockatiel = ["もふもふ","とさか","ほっぺ"]

配列に格納されている1つ1つのデータのことを要素という。
配列の中から1つの要素を取り出すには以下のように書く。

f:id:CitronCockatiel:20160117175227p:plain

var cockatiel = ["もふもふ","とさか","ほっぺ"] //ଘ(ㆁvㆁ)<配列の宣言
print(cockatiel[0]) //ଘ(ㆁvㆁ)<0(添字)の要素を表示する

Console Output

もふもふ

上記からわかるように、配列には自動的に0から始まる添字が付いている。
そのため先頭から二番目の箱に格納されているデータを取り出したい場合はcockatiel[1]となる。

配列の要素の変更をすることも可能である。

f:id:CitronCockatiel:20160117175510p:plain

var cockatiel = ["もふもふ","とさか","ほっぺ"] //ଘ(ㆁvㆁ)<配列の宣言

cockatiel[0] = "まんまる" //ଘ(ㆁvㆁ)<0の要素"もふもふ"を"まんまる"に変更する
print(cockatiel[0]) //ଘ(ㆁvㆁ)<0(添字)の要素を表示する

Console Output

まんまる

また、配列はfor文の繰り返しの範囲として利用できる。

Q テスト結果が国語95点、数学70点、英語80点である場合に、この3つのテストの合計点を配列とfor文を使って計算せよ。

f:id:CitronCockatiel:20160117175635p:plain

var total = 0 //ଘ(ㆁvㆁ)<変数totalに0を代入
let pointArray = [95,70,80] //ଘ(ㆁvㆁ)<変数pointArrayに配列を代入

for n in pointArray { //ଘ(ㆁvㆁ)<変数nが変数pointArrayの間は
    total = total + n //ଘ(ㆁvㆁ)<変数totalと変数nを足す
}
print(total) //ଘ(ㆁvㆁ)<変数totalを表示する

Console Output

245

配列が難しかったので途中で寝ようとしたら、嫁に叱られ最後まで書かされました。
怖いです。

次は辞書(dictionary)です。

if文,switch文,while文

ある条件に合致した場合のみコードを実行したい場合、if文を使用する。
if文の条件には、判定結果がブール値(tryeかfalseになる式)しか指定できない。

if文

var batteryRemaining = 18 //ଘ(ㆁvㆁ)<バッテリー残量が18だとする

if batteryRemaining <= 20 { //ଘ(ㆁvㆁ)<もしバッテリー残量が20以下だったら
   print("バッテリー残量が少なくなっています") //ଘ(ㆁvㆁ)<("の中を)表示する
}

もし変数batteryRemainingが21以上だったら、命令文は実行されない。
以上のコードに出てきた<=のような値同士を比較するために使用する記号を比較演算子(comparative operator)という。

f:id:CitronCockatiel:20151220224639p:plain:w300

書く意味はないけれど、100%処理が実行されるif文を書くことも可能である。

if true {
   print("常に条件は正しい")
}

if-else文

条件結果がfalseの場合でも何らかの命令文を実行したい場合if-else文を使用する。

var num = -1 //ଘ(ㆁvㆁ)<変数numに-1を代入する

if num > 0 { //ଘ(ㆁvㆁ)<もし変数numが0より大きかったら
   print("\(num)は正の数です") 
} else { //ଘ(ㆁvㆁ)<上に当てはまらなかったら
   print("\(num)は負の数もしくは0です")
}

if文の追加

elseの後にまたif文を追加することもできる。

int batteryRemaining = 18 //ଘ(ㆁvㆁ)<変数batteryRemainingに18を代入

if batteryRemaining <= 10 { //ଘ(ㆁvㆁ)<もし変数が10以下なら
   print("バッテリー残量は残り10%以下です")
} else if batteryRemaining <= 20 { //ଘ(ㆁvㆁ)<上を満たさず20以下を満たす場合
   print("バッテリー残量は残り20%以下です")
}

switch文

switch文はif文と同様に処理を分岐させる制御構文である。
処理の分岐が多い場合に、if文よりもシンプルにコードを書くことができる。

var nam = 1

switch num {
            
       case 0:
             print("0です")
       case 1:
             print("1です")
       default:
             print("わかりません")
}

他のプログラミング言語の中には各caseの末尾にbreakを記述して処理の官僚を明記しないと次のcaseまで処理してしまう言語もあるが、swiftでは1つのcase内の文が処理されるとswitch文が終了するため記述する必要はない。

while文

while文を使用すると、for文と同様に任意の処理を繰り返し実行することができる。
while文では指定した条件がfalseになる迄繰り返し実行される。 

var i = 0 //ଘ(ㆁvㆁ)<変数iに0を代入する

while i < 5 { //ଘ(ㆁvㆁ)<変数iが5より小さい場合以下の命令を繰り返す
         print(i)
         i = i + 1 //ଘ(ㆁvㆁ)<i+1をして上に戻る
}

Console Output

0
1
2
3
4

次は配列!

データ型(data type)

数値や文字といったプログラムが扱うデータの種類のことを型(type)またはデータ型(data type)という。
主な型には整数型、小数型、文字列型、ブール型がある。

文字列

文字列(string)とは、0文字以上の文字の連なりのことである。
Swiftでは空文字(empty string)と呼ばれる0文字の文字列を扱うことができるため、この様な定義となっている。
Swiftのプログラム内で文字列を扱うときは文字列を"(ダブルクォート)で囲んで書く。

また文字列もプログラムで扱うことのできるデータの為、数値と同様に変数に代入できる。
数値と違う点は文字列を"で囲む点だけである。

文字列を変数に代入する

var cockatiel = "オカメインコもふもふ"
print(cockatiel)

数値と数字の違い

プログラムを書く際、数値と数字(文字列)の違いを意識することが必要である。

print(1 + 1) //ଘ(ㆁvㆁ)<数値
print("1" + "1") //ଘ(ㆁvㆁ)<数字
print("1 + 1") //ଘ(ㆁvㆁ)<数字

Console Output

2
11
1 + 1

文字列補完

文字列に変数を埋め込む方法を文字列補完(string interpolation)という。
今までやったことでバッテリー残量が1%づつ減っていくプログラムを書こうとすると
残量の箇所分思いつくだけ用意することを思いつくが、それだと面倒なので文字列補完を使う。

var batteryRemaining = 18 //ଘ(ㆁvㆁ)<変数バッテリー残量に18を代入する
print("バッテリー残量はあと\(batteryRemaining)%なのです") //ଘ(ㆁvㆁ)<"で囲まれた文字列の中に\を書き、()内に式を書く

ブール(boolean)

ブール(boolean)とはtrue(真)またはfalse(偽)の二種類の値を扱う型である。
整数にも文字列にも無限の組み合わせがあるが、ブールにはtrueまたはfalseの二つの値しかない。

型を指定する

変数に入れるデータの型は明示的に指定することも可能である。

f:id:CitronCockatiel:20151220222340p:plain

var num : Int = 3 //ଘ(ㆁvㆁ)<整数
let pi : Double = 3.14 //ଘ(ㆁvㆁ)<小数

次はif文!

変数とかfor文とかのまとめ

今までのまとめっぽいコード。
書くのに10分以上かかったし、はじめ変数に加算するの忘れて全然違う答えになったりしたし、
後で復習したい。

1〜100までの全ての整数を合計するプログラム

var cockatiel = 0
for n in 1...100 {
      cockatiel = cockatiel + n
}
print( cockatiel )

Console Output

5050

今日はデータ型について書きたい、と思ってます。
書きたい、ナァ…

文(statement)

プログラム内には複数の命令を書くことができるが、1つひとつの命令のことを文(statement)と呼ぶ。

例えば

print( 1 + 1 )
print( 3 - 2 )

というプログラムがあったとする。
この場合
文はprint( 1 + 1 ),print( 3 - 2 )
また、トークンはprint,(,1,+,1,),print,(,3,-,2,)に分解できる。

なお、前回使用したプログラム(for文による三の段の計算)ではprint( 3 * n )という一つの文でのみ記述したが、forでは以下のように複数の文を記述することができる。

for n in 1...9 {
     print ( 3 * n )
     print ( 4 * n )
}

{}で囲まれた範囲内に記述された文を一つの塊として処理する。
このような{}で囲まれた文の塊をブロックという。

ブロック(block)

ブロックとは、複数の文の集まりで、一つの処理の塊である。
ブロック内の処理は順次処理で行われる為、以下のコードを実行しても三の段と四の段の計算結果は個別に表示されるわけではない。

for n in 1...9 {
     print( 3 * n )
     print( 4 * n )
}

Concole Output

3
4
6
8
9
12
.
.
.
27
36

ブロック内には文を記述できる為、新たに変数を宣言することもできる。
ただし、ブロック内で宣言した変数はそのブロック内でしか利用できない。
このような変数を利用できる範囲のことをスコープという。

繰り返し処理(for文)

私にも、毎日ブログを更新していくんだという強い気持ちがあった時期がありました。
明日はfor文について書くといい、二週間が経ちました。
そろそろ本気出す…

順次処理

基本的にSwiftは記述されている順番通りにコードを実行する。
これを順次処理という。
それに加えて、繰り返し処理と条件分岐という二つの方法で処理の流れを変えることができる。
繰り返し処理とは、指定した条件が満たされるまで、ある命令文を繰り返し実行する処理のことである。
このような処理の流れを総称して制御フローという。

for文の構文

for <定数名> in <範囲>  {
   <>
}

以上の繰り返し処理(for文)の構文を文章で表すと、<定数名>の値が<範囲>の間は<文>を実行するという意味になる。

for文による三の段の計算

for n in 1...9 { //文頭にfor(〜の間は),定数名を指定(n),in(〜の中で)で範囲を指定(整数...整数)
     print( 3 * n ) //3と定数nで指定された範囲の最後の値になるまで掛け算を行う
}

ConsoleOutput

3
6
9
12
15
18
21
24
27

今回定数名をnと指定したが、これはfor文の中だけで使われる一時的なものでカウンターと呼ばれる。
また、以下のコードでも同じ結果が得られる。

print( 3 * 1 )
print( 3 * 2 )
print( 3 * 3 )
print( 3 * 4 )
print( 3 * 5 )
print( 3 * 6 )
print( 3 * 7 )
print( 3 * 8 )
print( 3 * 9 )

バイトが割と忙しいので、毎日更新は難しいのですがなるべく頑張ります。

↓12月4日追記

for文の定数は宣言してはいけない

定数について書いた際、定数を使用するときはletキーワードを指定して定数名を宣言し、初期値を代入することが必要と書いた。
しかし、for文のカウンターとして使用する定数については、宣言や初期値の代入は不要である。