制御フローについて | 30歳高卒男子がプログラミングを習得してみるブログ

30歳高卒男子がプログラミングを習得してみるブログ

今年30歳になった高卒男子が自分で稼げるスキルを身に着けたいと思いたちSwiftのコードを学習しています。
最近はHTML/CSSとJavascriptをやってます。そのうちまた、スイフトもやろうと思ってます。

皆さんこんにちは。

今日は制御フローについてわかったことをまとめたいと思います。

とその前に気づいてしまったことがありまして、今Appleから出ているSwiftのマニュアルを読んでプログラミングとは何かをつかもうという試みをしているのですが、目次を開くと現在読んでいるのが”A Swift Tour”という項目でこの項目が終わると”Language Guide”という項目があるので多分そちらで詳しく説明しているのだと思います。なので今読んでいる項目ですべてを理解する必要がなさそうだということに気づきました。

今やっている”A Swift Tour”についてはざっくりとやっていきたいと思います。

ぼくは普段本を読むときは目次をあまり深く見ないのですが、やっぱりちゃんと目次を見たほうがいいですね。

それでは始めていきます。

 

ifとswitchを使って条件を、for-in、whileそしてrepeat-whileを使ってループを作ることができます。

条件やループの周りのカッコ()は任意で、bodyの周りのブラケットたち{}は必要です。

 

for-inを使ったコード

let individualScores = [75,43,103,87,12]

var teamScore = 0

for score in individualScores{

    if score > 50{

        teamScore += 3

    }else{

        teamScore += 1

    }

}

print(teamScore)

//Prints “11”

 

これは”individualScores”というArrayの中にある値が50以上であれば”teamScore”に3点ずつ、それ以下であれば1点ずつ足していって最後にteamScoreをプリントするプログラムですね。

この項目には詳しい構文の説明が書かれていないのでサクッと行きましょう。

ただ、マニュアルにはif文の条件はBoolean expressionでなくてはならないので、このようなコードは間違いだよと書いてありました。

ちょっと何言ってるかよくわからないですね。Booleanはおそらくブール式のことでTrueかFalseかそもそも命題が間違っているで判断する式のことだそうです。

あ、書いてて思ったけどそのままか。でもまだよくわからない。

 

次!!ifとletを組み合わせて作るコードです。

プログラミングの世界には”optional value”というのがあるらしく、これは値を含むかもしくは値がないnilを含むことができるらしいです。

ifとletを組み合わせてコーディングすることによって値のありなしを判断できます。

値の型(Type)のあとにはてな?をつけるとその値はoptionalであるとマークできます。

 

var optionalString: String? = “Hello”

print(optionalString == nil)

//Prints”false”

 

var optionalName: String? = “John Appleseed.”

var greeting = “Hello!”

if let name = optionalName{

    greeting = “Hello, \(name)”

}

 

まず”optionalString”を作るときにString型のあとに?をつけてoptional valueだということをマークしてますね。

そして”==“を使って”optionalString”は値を持たないnilですかー?と聞いてfalse(違います)という値をプリントしてますね。

次にoptionalNameを作るときにも型(Type)に?をつけてもし”optionalName”に値があれば”name”に”optionalName”を代入して”greeting”を実行するというわけですね。

“greeting”をプリントするコードを書いて実行すると”Hello, John Appleseed.”とプリントされます。

もし、optionalNameを値を持っていないnilにしてプリントすると”Hello!”とだけプリントされます。

 

var optionalName: String? = nil

var greeting = “Hello!”

if let name = optionalName{

    greeting = “Hello, \(name)”

    }else{

        greeting = “Hello, everyone.”

    }

print(greeting)

 

else文を追加して”optionalName”がnilの場合に”Hello, everyone.”とプリントするコードも書いてみました。

 

もしオプショナル値がnilの場合、条件はfalseになってブレーシズ{}の中のコードはスキップされます。

逆に値がある場合はその値はアンラップ(unwrap)されて、上のコードの場合は”name”に代入されます。

他にもデフォルト値を用意してオプショナル値を扱う方法もあります。これには??オペレータを使います。

もしオプショナル値がない場合(nilの場合)、デフォルト値が代わりに使われます。

 

let nickName: String? = nil

let fullName: String = “John Appleseed”

let informalGreeting = “Hi \(nickName ?? fullName)”

この場合“nickName”がオプショナル値で”fullName”がデフォルト値ですね。

コンパイルすると、"nickName"がnilなのでデフォルト値の"fullName"が使われますね。

 

switch文

switchはどんな種類のデータも扱えて、広い種類の比較操作をサポートしてくれるそうです。

schooの講座で作ったどうぶつ占いにも使われてましたね。

 

let vegetable = “red pepper”

switch vegetable{

case “celery”:

    print(“Add some raisins and make ants on a log.”)

case “cucumber”,”watercress”:

    print(“That would make a good tea sandwich.”)

case let x where x.hasSuffix(“pepper”):

    print(“Is it a spicy \(x)?”)

default:

    print(“Everything tastes good in soup.”)

}

//Prints”Is it a spicy red pepper?”

 

これは多分末尾に”pepper”がつくものがあるケースを実行するようにしたプログラムですかね。

試しに”vegetable”の値を”red apple”にすると”default”のケースが実行されました。

最後の”default”のケースを取ってしまうとswitch文はexhaustiveでなければならないとエラーになります。

switchケースの中にある条件にあったコードが実行されたあとプログラムはswitch文から抜け出します。

続けて次のcaseは実行されないのでswitchを抜け出すためにそれぞれのcaseのコードにここで終わりですよんと書く必要はありません。

 

for-in構文を使ってdictionaryの中のアイテムを反復させる

Dictionaryは順番が決まっていない集合なので、中のkeyや値は適当な順番で反復されます。

 

let interestingNumbers = [

    “Prime”: [2,3,5,7,11,13],

    “Fibonacci”:[1,1,2,3,5,8],

    “Square”:[1,4,9,16,25],

]

var largest = 0

for (_, numbers) in interestingNumbers{

    for number in numbers{

        if number > largest{

            largest = number

        }

    }

}

print(largest)

//Prints”25”

 

なんかちょっとむずかしいのでサラッといきましょう。

“numbers”に”interestingNumbers”を代入してその”numbers”を”number”に代入して”number”を”largest”と比較して大きければ”largest”に”number”を代入するというループですね。

コンパイルのログに”8times”と出てたのでおそらく”2<3<5<7<11<13<16<25”と当てはめていったのだと思います。

for(_, numbers)のアンダースコアの意味がわかりませんねぇ。

 

次!!while文です。

whileを使うと条件が変わるまでブロックのコードを繰り返します。

ループは少なくとも1回は実行されます。

 

var n = 2

while n < 100{

    n *= 2

}

print(n)

//Prints “128”

 

var m = 2

repeat{

    m *= 2

}while m < 100

print(m)

//Prints “128”

 

あれ?nとmはそれぞれ100以下の範囲で設定してるのに最後128がプリントされてるけどいいの?

と思ったけど128になる前の64の時点では100以下だからいいんですね。

最後に64*2して100以上になってしまったから終わりって感じですね。

whileとrepeat-whileはどうやって使い分けるのかな。

 

それとループの中のindexの範囲を決めるのに..<を使えます

var total = 0

for i in 0..<4 {

    total += i

}

print(total)

//Prints “6”

 

0..<4だと4は含まれませんが、0…4だと4も含まれるようです。

ここで出てきた+=とか*=は他にも仲間がたくさんいるみたいなので来るべき時が来たら触れたいと思います。

 

ちょっとプログラミングらしくなってきて楽しいですね。

switch文なんかはどうぶつ占いにも出てきたけど他にもいろいろな使い方ができそうでワクワクしてきますね!

早く思いのままに使いこなせるようになりたいです。

次回はFunctionsとClosuresです。

それでは!!