Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
71
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

詳解Swift改訂版を読んで気になった基本的な文法の再確認

詳解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の値をアンラップして返し・・・・
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
71
Help us understand the problem. What are the problem?