プログラムの実行フローを管理する -Swift編-
今回は、if文やfor文を使ってプログラムの実行フローを管理する方法を書きたいと思います。
参考にしたのはApple Inc.からiBooksを通じて提供されている"The Swift Programming Language (Swift2.1)"です。
for文
よく使われるループの文です。
var secondForLoop = 0 for var i = 0; i < 4; i++ { secondForLoop += i } print(secondForLoop)
ただ、このコードの中でのi++についてはSwift3で廃止予定のようですので、この記法はあまり薦められるものではないかもしれませんね。 今後これと同じコードを書こうと思えば、以下の様なコードを書きます。
var secondForLoop = 0 for i in 0..<4 { secondForLoop += i } print(secondForLoop)
この中の
for i in 0..<4
の部分が、先ほどの
for var i = 0; i < 4; i++
に当たります。スッキリ書けるようになりましたね。個人的な感想としては、Swiftは徹底的に";"を嫌っているようです。
for in
for inを使ったコードのサンプルを作ります。
let testScores = [75, 43, 100, 87, 12] var evaluation = 0 for score in testScores { if score > 45 && score < 61 { evaluation += 3 } else if score > 60 && score < 76 { evaluation += 4 } else if score > 75 && score < 91 { evaluation += 5 } else if score > 90 { evaluation += 6 } else { evaluation += 0 } } print(evaluation)
for in文はinの後に配列名を入れ、その要素を順に取り出すという役割を担います。取り出した要素は、ここではscoreという変数名に代入してfor in文内の処理に使います。 if文は、C言語などでは()でくくるのですが、swiftではくくる必要がありません。それ以外は、他の言語と変わりませんね。
if文
ここで、if文を扱いたいと思いますがその前に、optionalという型のような概念があるようです。これは、nilというCで言うとNULLのようなものを定義できる変数かを明記できる方法らしいです。
optional
一度使ってみます。以下に2つのサンプルプログラムを書きました。
var optionalString: String? = "Hello" print(optionalString == nil)
var optionalString: String? = "Hello" optionalString = nil print(optionalString == nil)
このコードを実行すると、上のコードはfalse下のコードはtrueという実行結果が返ってきます。
optional変数を明記する場合は、変数の型を明記するときに型の名前の後に"?"をつけます。これを行なうことで、nilを扱うことが出来ます。もしもこの"?"が無いとエラーが出ます。
if文の使い方
僕が個人的に使うif文の使い方は、if(条件式)という形態でswiftも基本的な記法は変わらないのですが、以下の使い方が初めてだったので、書き記しておこうと思います。
var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = optionalName { greeting = "Hello, \(name)" print(greeting) }
このif文ではnameという変数にoptionalNameを代入できれば、つまりoptionalName != nilであればif文内の処理を実行するという意味になります。 試しに、以下のサンプルコードを実行してみると、出力されなくなります。
var optionalName: String? = "John Appleseed" var greeting = "Hello!" optionalName = nil if let name = optionalName { greeting = "Hello, \(name)" print(greeting) }
nilの判定条件式
nilであるかどうかを判定して、出力結果を操作する条件式があります。以下がサンプルコードになります。
let nickName: String? = nil let fullName: String = "Mike Seed" let informalGreeting = "Hi \(nickName ?? fullName)" print(informalGreeting)
このコードについて
(nickName ?? fullName)
が、判定のコードとなります。左のnickNameがnilであればfullNameを取るというものです。 つまり
``swift let nickName: String? = "Mike"
のように書き換えることで、実行結果はnickNameを取るようになります。 # switch文 次に、switch文について書きたいと思います。switch文は、与えられた変数や条件式が当てはまれば以下の実行を処理するという機能を持っています。今回のサンプルコードは、参考にしたテキストのコードを引用しています。
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.")
}
このコードの中に
case let x where x.hasSuffix("pepper"):
という文があります。これは、xについて末尾がpepperで終わっていた場合処理するという命令です。vegetable変数の中をいろいろ書き換えることで挙動を調べることが出来ます。 また、C言語などとは違いcaseの最後にbreakを入力する必要はありません。 # while・repeat文 これもまた、よく使うループですね。while文の条件式がtrueであれば中のプログラムをループ処理するというものです。
var n = 0
while n < 100 { n = n + 4 print(n) }
swiftでは、repeatという方法でもループが出来るようです。基本的にはwhileと同じなのですが、条件はスコープ({})の末に記します。
var n = 0
repeat { n = n + 4 print(n) } while n < 100 ``
for in, if文を使ったプログラム
これは、今回参考にしたDocumentに書かれていたプログラムに、僕自信が挙動を知るために適宜printを挿入しています。
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(kind, numbers) in interestingNumbers { print(String(kind) + "," + String(numbers)) for number in numbers { print(number) if number > largest { largest = number } } } print(largest)
コードの見方は、前述したとおりなのですがまず一番初めのfor in文で、interestingNumbersからkindに"Prime"や"Fibonacci"などのラベル(この場合はおそらく数列名)、numbersで配列を読み取ります。
その次のfor inでnumbersからnuberに一つずつの要素を代入します。後は、largestと比較し大きければlargestにnumberを代入するというプログラムです。
お問い合わせ
もしも「ここ、おかしいんじゃないかな」とか「よくわからない」という所があれば、記事にコメントいただけると嬉しいです。