詳解Swift改訂版が出てきたので、気になった文法を復習がてらまとめていきます。
業務でswiftを使ってはいるものの、swift2.0以降の新しい機能を使ってなかったり、基本的なところで、あまり意識できてなかったところがあったので、そのあたりについてつらつらと書いていきます。
あんまり意識できていなかった系
変数の宣言の仕方
宣言時には、型を明記するより、明記せずに積極的に初期値を設定する(型推論で型の判断)にとどめるのがよい。
var count: Int = 10 // つまりこちらより、
var count = 10 // こちら
print関数
print関数の引数は異なる型が混じっててもよい
print(2016, "正月", true)
// "2016 正月 true\n"
separator(複数の引数間を区切る文字列の指定)を使うとデバッグの時に便利そう
print(2016, "正月", true, separator:"; ")
// "2016; 正月; true\n"
###配列の初期化のパターン
イニシャライザを呼び出す形での初期化
var s: [String] = [] //空配列入れるやり方だけでなく
var s = [String]() //イニシャライザでの初期化もある
###識別子
予約語はバッククォーテーションで囲むと識別子として利用することができる
var `var` = 10
###for文で複数の変数
for文は複数の変数をつかって、複数の変数に関する値の更新することもできる
// カンマでくくったm=1やm*=2のとこ
for var i=0, m=1; i<3; i++, m*=2 {
print("\(i) \(m)")
}
###for-in文で条件指定
Swift2.0以降でwhere節で条件指定が可能になった
for i in 1..<10 where i%2 == 0 {
print(i, terminator: " ")
// 偶数だけ表示される
}
###do文
ブロック内で変数を定義
var a = 1
var c = 10
if a >= 0 {
{ let t = a; a = c; c = t} //変数tはこのままだと宣言できずエラー
print(a)
print(c)
}
var a = 1
var c = 10
if a >= 0 {
do { let t = a; a = c; c = t} //エラー解消
print(a)
print(c)
}
ラベルをつかってdo文ブロックからの離脱
myLabel: do { //ラベル名: myLabel
for i in 0 ..< 10 {
if i > 5 { break myLabel } //条件満たしたらdo文ブロックからの離脱
print("\(i)", terminator: " ")
// 0 1 2 3 4 5
}
swift2.0以降の機能でちゃんと使っていなかった系
guard文
使うシチュエーションは、optional binding(if-let文)と重なるが、optional vindingだと複雑なケースでif文のネストが深くなっていき、それぞれの例外に対しての処理も書いていくと見にくいコードになるが、guard文を使うと、例外的な状況への対応とそこからの離脱(returnやbreak)をコンパクトに記述できるからより見やすくなる。
let box = ["01", "02", "5", "q", "X"]
for str in box {
guard let v = Int(str) else { // else{} はguardの条件節を満たさなかった場合に実行される
print(str + "???")
break
}
print(v, terminator: " ") // guardの条件節で宣言した定数vを利用することができるのが特徴的
// 1 2 5 q???
}
###nil合体演算子の複数組み合わせ
if-let文の簡易版として??が使われるが、??を複数組み合わせることもできる
let val = a ?? b ?? c ?? 0
// aがnilじゃないならaの値をアンラップしてを返し、nilなら次はbを評価、bがnilじゃないならbの値をアンラップして返し・・・・