BETA

A Swift Tour の覚書(1)変数、制御構文

投稿日:2019-10-28
最終更新:2020-02-21

自分が気になるところだけメモ

変数の代入

var myVariable = 42  
let myConstant = 42  

再代入する場合は var、定数の場合は let
変数の型は初期化時に決定する。型は、決定後は変更できない。
明示的に指定することもできる。

let myInteger = 42  
let myDouble = 42.2  
let MyExplicitDouble: Double = 42 // 代入する値はInteger風だが、型をしているのでDouble型  

nilになりうる変数の場合、?を用いて宣言する必要がある。

var str: String = nil // => コンパイルエラー  
var str: String? = nil // => コンパイルを通る  

オプショナルな値に対しては、??演算子によってデフォルト値を与えることができる。

let nameArray = ["John", nil, "Pyrrha"]  

for optionalName in nameArray {  
    let name = optionalName ?? "Ruby"  
    print(name)  
}  
// => John, Ruby, Pyrrha  

文字列内での変数の展開

JavaScriptでいうテンプレートリテラルは \(variable_name)で行う。

let myConstant = 42;  
let answer = "the answer is \(myConstant)."  

改行を含む場合は、文字列を3連ダブルクォーテーションで囲う。

let quotation = """  
I said "I have \(apples) apples."  
And then I said "I have \(apples + oranges) pieces of fruit."  
"""  

配列

配列の扱いはJavaScriptに類似する。
ただし、連想配列でも[]で囲う。

let numberArray = [1,2,3]  
print(numberArray[1]) // => 2  
numberArray.append(4) // => [1,2,3,4]  
// 空で初期化する場合  
let emptyArray = [String]()  
let emptyDictionary = [String: Float]()  

配列の型が推測できる場合は、以下のように書ける。
変数に対して新しい値を設定する場合や、関数の引数として渡す場合等がこれに当たるらしいが、現時点ではよくわからない。

var shoppingList = ["catfish", "water", "tulips"]  
var occupations = [  
    "Malcolm": "Captain",  
    "Kaylee": "Mechanic",  
]  

// 変数に再代入する場合は、すでに型が決まっているため以下のように書けるということか?  
shoppingList = []  
occupations = [:]  

制御構文

ループ

ループにはfor-in while repeat-whileが使える。
ループ条件を括弧で囲うがどうかは任意。

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)  

連想配列のfor-in。連想配列では順序は保証されない(JSONと同様)

let teamRwbySongs = [  
    "Ruby Rose": "Red Like Roses",  
    "Weiss Schnee": "Mirror, Mirror",  
    "Blake Belladonna": "From Shadows",  
    "Yang Xiao Long": "I Burn"  
]  
for (name, song) in teamRwbySongs {  
    print("\(name)'s song is \(song)")  
}  

特定の整数の配列を回したい場合、以下の構文が使える。

for i in 0..<4 {  
    print(i)  
}  
// => 0,1,2,3,  

なお、<の代わりに=<等を使うことはできない。

while, repeat-while

Javaとほぼ同様。repeat-whileはJavaのdo-whie

分岐

if

ifでは条件でletを使うことができる。この場合、代入した値が nilである場合、処理が実行されない。

var optionalString: String? = "Hello"  
print(optionalString == nil)  

let nameArray = ["john", nil, "jane"]  

for optionalName in nameArray {  
    var greetings = "Hello!"  
    if let name = optionalName {  
        greetings = "Hello! \(name)"  
    }  
    print(greetings)  
}  
// => "Hello! john", "Hello!", "Hello! jane"  

switch

switchはどんな型のデータも扱うことができる。また、幅広い比較演算子にも適用できる(どういうことかは謎)。
case defaultはマッチした場合はそこで処理が停止する。Javaのようにbreakする必要はない。
なお、default:は必須。省略するとコンパイルを通らない。

let vegetableArray = ["red pepper", "celery", "cucumber", "watercress", "calot"]  

for vegetable in vegetableArray {  
    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.")  
    }  
}  
// results:  
// Is it a spicy red pepper?  
// Add some raisins and make ants on a log.  
// That would make a good tea sandwich.  
// That would make a good tea sandwich.  
// Everything tastes good in soup.  
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@meteorideの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう