2015年9月26日土曜日

【Xcode / Swift入門】条件分岐とループ制御について

本稿では、Swiftの条件分岐とループ制御、つまりif文、switch文、for文、while文、について説明していきます。


if文

if文はSwiftを含め他のプログラム言語でも非常によく使用される条件分岐の構文です。日本語訳と一緒で、「もし〜だったら◯◯」といった使い方をし、下記のように記述します。

if 条件{ ◯◯ }

上記の場合は、”もし条件が正しければ、◯◯を実行する”という意味になります。

ifとセットになって必要になるのが、elseです。elseも日本語訳通り、「その他の」といった使い方をし、下記のように記述します。

    
if 条件1 {
    もし条件1が正しい場合、ここに記載された構文を実行する
} else if 条件2 {
    もし条件2が正しい場合、ここに記載された構文を実行する
} else {
    上のどの条件にも当てはまらない場合、ここに記載された構文を実行する
}

ここで、注意が必要なのですが、ifの後ろの”条件”には、正しいか正しくないか判断する構文を記載する必要があります。つまり、ifの後ろはtrue or false で返すBool型である必要があります。

また条件には、&&や||の記号を使用することにより、複数の条件をANDやORで連結することも可能です。
    
if 条件1 && 条件2 {
    もし条件1と条件2が正しい場合、ここに記載された構文を実行する
} else if 条件3 || 条件4 {
    もし条件3もしくは条件4が正しい場合、ここに記載された構文を実行する
} else {
    上のどの条件にも当てはまらない場合、ここに記載された構文を実行する
}

それでは、Playgroundにて下記のようなソースコードを記述してみます。

var result2:Int = 0

var time : Int
time = 25
if time < 5 {
    print("もう\(time)時だ。早く寝よう。")  
}else if time < 10 {  
    print("\(time)時ですね。おはようございます")
}else if time < 15 {  
    print("\(time)時ですね。こんにちは")
}else if (time < 17) {   
    print("\(time)時ですね。お疲れ様です")
}else if (time < 24) {
    print("おやすみなさい")
}else {
    print("エラー:そんな時間はありません")
}



結果を見てわかる通り、timeの値により条件分岐されています。







※C言語やJavaなどでは、if の後ろの条件式は、()をつけるする必要がありますが、Swiftでは、()は不要です。もちろんつけても問題ないです。


switch文

switch文は値によってコードを切り替えてくれる、つまりスイッチしてくれる条件分岐の構文になります。 casedefaultという値を使って、下記のように記述します。
    
switch 比較する変数や定数 {
case 値1:
    比較する変数や定数が値1と一致する場合の処理
case 値2:
    比較する変数や定数が値2と一致する場合の処理
case 値3,値4:
    比較する変数や定数が値3もしくは値4と一致する場合の処理
 default:
    どれとも一致しなかった場合の処理
}


また、caseは、範囲指定も可能です。範囲指定する場合は、値と値の間を「...」で結びます。

例えば、1〜10と範囲指定したい場合は、
case 1...10:
と記述します。

それでは、if文のときと全く同じ結果になるようにSwitch文でも記述したいと思います。

var time : Int

time = 17
switch time {
case 0...5:    
    print("もう\(time)時だ。早く寝よう。")    
case 6...10:   
    print("\(time)時ですね。おはようございます")
case 11...15:   
    print("\(time)時ですね。こんにちは")   
case 16...17:   
    print("\(time)時ですね。お疲れ様です")   
case 18...24:   
    print("おやすみなさい")
default:
    print("エラー:そんな時間はありません")
}

下記の結果をみてわかる通り、timeの値によって、表示する文字列が分岐(スイッチ)されていることがわかると思います。




for文

for文は、繰り替え処理を実行することができるループ制御の構文です。記述方法として、下記2種類あります。
    
①
for 変数定義 in スタート値...終了値 {
    繰り返し実行する処理
}

②
for 初期処理(変数定義など);  繰り返し条件(どういう場合に繰り返すのか); 後処理(変数値を増やすなど) {
    繰り返し実行する処理
}

①の場合、forの後に定義した変数にスタート値〜終了値までを代入し、その回数分、処理を繰り返します。
例えば、
for index in 1...10{
処理1
}
と記述した場合は、
indexに”1”を代入し処理1を実行、indexに”2”を代入し処理1を実行・・・indexに"10"を代入し、処理1を実行、終了
という動作をします。

②の場合、初期処理にて定義した変数を用いて、その変数が繰り返すための条件を記載し、
例えば、
for var i = 0; i<10; i++{
処理1
}

と記述した場合、
iが10より小さい場合は、処理1を実行し、処理1が終われば、i++(iを1増加)させる
という処理になります。

では、実際にPlaygrundでどういう動きをするか見てみましょう。
2つのパターンで、1〜10の足し算をしてみたいと思います。

下記のように記載してください。
    
var result1:Int = 0
for index in 1...10{   
    result1 = index + result1
}
print(result1)
var result2:Int = 0
for var i = 0; i <= 10; i++  {    
    result2 = i + result2
}
print(result2)

どちらのコードも、数字を1ずつ増やしそれを足していっていることがわかると思います。
また、結果を見てもわかる通り、どちらも1〜10が足されて、55が出力されていることが確認できると思います。


while文

While文はfor文と同じく繰り返し処理を行うループ制御の構文です。While文はfor文と違い繰り返し回数が不明の場合(何回繰り返すかわからない、もしくは決まっていない場合)、使用します。記述方法としては、以下の2種類があります。

①繰り返し条件を始めに記載する方法
 ※繰り返し条件に一致しない場合、何も実行されない

    
while 繰り返し条件{
 繰り返す処理
}

②繰り返し条件を終わりに記載する方法
 ※繰り返し条件に一致しない場合、repeatに記載がある処理を1回だけ実行される

    
repeat{
    繰り返す処理
} while 繰り返し条件

※Swift2.0よりdoではなく、repeatを使うようになっています。

では、実際にPlaygrundでどういう動きをするか見てみましょう。
こちらでもfor文と同じく1〜10の足し算について、ソースコードを記述したいと思います。
    
var result1:Int = 0
var i:Int = 1
while i <= 10 {
    result1 = i + result1
    i++
}
print(result1)
var result2:Int = 0
var j:Int = 1
repeat {
    result2 = j + result2
    j++
} while j <= 10
print(result2)



条件分岐とループ制御については、以上です。
次回は、配列(Array)とディクショナリーについて説明したいと思います。




2015年9月25日金曜日

iPhone6sを本日(発売日:9/25)ゲットしてきました。

本日発売のiPhone6S早速ゲットしました。ゲットしたのはiPhone6s シルバー128GBです。

参考までに、予約した時間と入荷連絡があった時間は下記の通りです。

予約時間:9/12 17:00



入荷連絡:9/24 21:13



iPhone5S(800万画素)とiPhone6S(1200万画素)の写真画素数の差を比較するために、まずは写真を撮ってみました。
どちらがiPhone6Sからお分かりでしょうか?




正解は、下の方の写真です。
拡大しても微妙に違いがわかるかなって感じでした。

いろいろ使ってみてそのうちレビューしたいと思います。


2015年9月24日木曜日

【Xcode / Swift入門】Swift2.0の変更点(随時更新)

本稿では、Swift 2.0での変更点を気づいた段階で記載していきます。

Println関数


 《変更前》Println()
 《Swift 2.0》Print()

toInt()関数


   テキストフィールドなどから取得した値をIntにする場合に使用するtext.toInt()ですが、Swift 2.0から使用できなくなっています。「"toint()" is unavailable」というエラーが出力されます。その変わりInt()を使用するよう促されます。

 《変更前》TextField.text.toInt()
 《Swift 2.0》Int(TextField.text)

let と varの宣言


 warningレベルですが、varで定義した値がその後変化しない(変数ではない)場合、letにした方が良いとwarning出力されるようになっています。

touchesBeganメソッド


 タッチを検出するオーバーライドファンクションのtouchesBeganメソッドですが、Swift 2.0から下記のように変更になりました。

《変更前》
 override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
}

《Swift 2.0》
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
 }

do-while文

 《変更前》
 do {
  繰り返し処理
 }While 繰り返し条件

 《Swift 2.0》
 repeat {
  繰り返し処理
 }While 繰り返し条件





2015年9月1日火曜日

【Xcode / Swift入門】オプショナル型について

本稿では、Swiftのoptional type / optional value(オプショナル型)について、説明します。

オプショナル型について

オプショナル型とは、変数に何も値が入っていない状態(空の状態)と値が入っている状態(通常の状態)の両方を持つことができる変数もしくは定数のことを言います。つまり、空の値が入るかもしれない変数を使用する際に定義します。また、Swiftでは、変数に何も値が入っていない空の状態のことを"nil"と表現します(他のプログラミング言語の"null"と同義です)。

宣言方法は、変数を宣言時に、型の後ろに"?"をつけます。

var 変数名: 型?

では、Playgroundを起動し、下記のコードを記述してみます。
    
//Optional型にnilを代入
var optionalString: String? = "hello"
optionalString = nil
println(optionalString)

//通常の変数にnillを代入
var nomalString: String = "hello"
nomalString = nil
println(nomalString)

すると、Optional型の変数にnilを代入した場合は正常に動作しているのに対し、通常の(Optional型ではない)変数にnilを代入するとエラーを出力することがわかると思います。





このように、nilの値の許容を変数の定義時に行うことによって、nil起因によるアプリの不具合(バグ)を事前に対処することができます。また、アプリ開発者が忘れがちなnil対処をエラーレベルで(ビルド時に)チェックすることができます。

unwrap(アンラップ)について

次に、Optional型とセットで覚えておく必要があるアンラップについて説明します。
Swiftでは、通常の変数と、空の値が入るかもしれないOptional型の変数を明示的に区別しています。そのため、Optional型で定義した値を、関数の引数に代入する際、「"nill"ではありません」と明示的に定義する必要があります(指定しない場合、エラーが出力されます)。

例えば、下記のようにコードを記述してみます。
※文字列(" "で囲めば文字列と認識します。)の中に変数の値を代入したい場合は、\( )を使用します。「\」はoption + ¥です。
    
var optionalString: String?
var nomalString: String
optionalString = "hello"
nomalString = "world"
println("世界一有名なプログラムは\(optionalString + nomalString)である。")

すると、”Stringはオプショナル型の値だけど、unwrap(アンラップ)されていません”とエラーが出力されます。



この「"nill"ではありません」と明示的に定義する方法のことをunwrap(アンラップ)と呼び、変数の後ろに”!”をつけること宣言可能です。つまり、上記の例で言うと、”\(optionalString + nomalString)”のoptionalStringの後ろに"!"を付与することにより、エラーを回避し、正常に動作します。




暗黙的なアンラップについて

オプショナル型の宣言方法は上記(型の後ろに"?"をつける)以外にもう一つあります。それは、暗黙的なアンラップという方法です。これは、変数定義時に、"?"ではなく"!"をつけることにより、常にアンラップ状態となり、引数に渡す際の"!"が不要になります。



初期値には、nilが入るかもしれないが、それ以降は必ず値が入る(nilではない)場合に利用するものになります。

オプショナルバインディングについて

オプショナル型の変数をif文などの条件文にて使用する場合、 値が入っていれば"true"、nilの場合は"false"として扱うことが可能になります。例えば、下記のようなコードを記述し、optionalString = "hello"を削除してみてください(つまり、optionalString = nil)。
    
var optionalString: String!
var nomalString: String
optionalString = "hello"
nomalString = "world"

if let isString = optionalString {
    
    println("世界一有名なプログラムは\(optionalString + nomalString)である。")
    
}else{
    
    println("文字列なし")
    
}

optionalString = "hello"の場合とnilの場合で、条件が分岐していることが確認できます。



この手法は、"nil"の場合の処理を意識しなくとも記述することになりますので、とても便利な機能です。

オプショナル型の説明は以上になります。
次回は、for文 / While文などの制御構造について説明したいと思います。