基本 †Java などでは、クラスを実体化したものだけをインスタンスと呼んで、他の基本データ型のデータを区別した。 しかし、Swiftではどのような型であってもデータをインスタンスとよぶ。 データ型と変数 †Swiftでは、データ型のほとんどは値型(value type)であり、参照型 (reference type)はクラスのインスタンスとクロージャだけである。 ポインタを表す記述方法はないが、複数の変数から同時に参照されるデータとそうでないデータは区別して考える必要がある。 基本的なデータ型 †
変数と定数 †
変数の定義 var 変数名 [: 型] [= 式] var age: Int = 18 // 型宣言と初期値の代入 var age = 18 // 初期値から型(Int型)は推論される age = 20 // 値を変更できる 定数の定義 let 変数名 [: 型] = 式 let name: String = "Taro Yamada" let age = 2016 - 1992 // 初期値から型(Int型)は推論される Swiftでは暗黙の型変換は行わない。 let n: Int = 10 var a: Double = n // エラー var b: Double = Double(n) // 明示的に型変換する 文字列 (String型) †String型のインスタンスは、プログラム中で""(ダブルクォート)で囲んでリテラルとして記述できる。 また + 演算子で連結して新しい文字列を生成することができる。 Unicodeの文字コード(スカラ値)を \u{8文字の16進数} で直接表すこともできる。 let specialKeys = "command=\u{2318}, opeiont=\u{2325}" また、’"\(式)"のように記述することで式を値とした文字列を生成できる。 let n = 8 let str = "\(n) の2乗は \(n*n) です" print(str) print関数は引数で与えられたものを(引数が複数個でも)そのまま表示する。セパレータや改行を指定することもできる。 print(2016,"年",7,"月") // 2016年7月 と表示される。 print(2016,"年",7,"月", separator: "; ") // 2016; 年; 7; 月; と表示される。 print(2016,"年", terminator: "") // 2016年と表示された後、改行されない print(7,"月") // 7月 が追加で表示され、改行される。 配列 Array †配列に格納されるインスタンスは全て同じ型である必要がある。 次の6つの例はどれも同じ意味である。 var a: [Int] = [2, 5, 8, 11, 7] var a: Array<Int> = [2, 5, 8, 11, 7] var a = [2, 5, 8, 11, 7] var a = [Int]() ; a.append(2); a.append(5); a.append(8); a.append(11). a.append(7) var a = Array<Int>() ; a.append(2); a.append(5); a.append(8); a.append(11). a.append(7) var a:[Int] = [] ; a.append(2); a.append(5); a.append(8); a.append(11). a.append(7) 配列の各要素を表示する for var i=0 ; i<a.count; i=i+1 { print(a[i]) } 演算子 †代入の演算子は値を返さない。 a = b = 1 // エラー if a = b { ... } // エラー 演算子の両側に空白があるか、どちらにも空白がない場合には、その演算子を二項演算子として解釈される。 a + b // 二項演算子 a+b // 二項演算子 演算子の左側に空白がない、かつ、右側に空白がある(または区切りがある)場合は、後置演算子として解釈される。 a++ b // 後置演算子 演算子の左側に空白がある(または区切りがある)、かつ、右側に空白がない場合は、前置演算子として解釈される。 a ++b // 前置演算子 Swift言語では自分で演算子を定義できるため、上記のルールとなっている。 n /(i +1) //演算子 / と + の前後に空白をいれるか、または空白を取り除くべき 識別子 †識別子として ASCII 文字を用いる場合 camel case 方式で名前をつける(語の始まりの文字を大文字で、他の文字を子文字で表す)ことが推奨されている。 Objective-C で作成されたプログラムを Swift で使う場合、もしも Objective-C の中で Swift の予約語が使われていた場合は バッククォート``で囲む。 var `fallthrough` = 20 型に別名をつける †既存の型名や、自分で定義したクラスや構造体の名前に別名をつける場合は、typealiasを使う typealias SInteger = Int32 制御構文 †if文 †if 条件節 { 文... } else if 条件節 { 文... } ese { 文... } 次の文は同じ意味となる。 if a >= 0 { b = a } else { b = -a } b = a>= 0 ? a: -a while文 †while 条件節 { 文... } repeat - while 文 †repeat { 文... } while 条件節 for 文 †for 初期化; 条件式; 更新 { 文... } (例) for var i=0; i<10; i=i+1 { print(i) } for - in 文 †for 定数名 in 式 [where 式] { 文... } (例) for i in 0..<10 { print(i) } forの後に書かれた定数名は、暗黙のうちに let が記述されているものとして扱われる。 範囲演算子
for i in 1..<15 where i % 2 != 0 && i % 3 != 0 { print(i, terminator:" ") } print("") 1 5 7 11 13 // 1から14までのうちで、2でも3でも割り切れない数字が表示される switch 文 †
switch 式 { case label1: 文... // break は不要 case label2: 文... // break は不要 default: 文... } switch n { case 0: print("one") // break は不要 case 1: // エラー。何らかの文が必要。 case 2,3: // 複数を列挙することができる print("two or three") case 4: print("four, but go through ") fallthrough // 下のcase節の文をそのまま実行するk case 5: print("five") case 6: break; // break を記述してもよい。 default: // defaultは最後に書く(オプション扱い) print("several) } 以下の例では、変数 score の値は 65 なので、条件としては「case limit..<75」と 「case 60 ..< 70」の両方に適合するが、上に書いてある条件 「case limit..<75」の文が実行され、「追試験」と表示される(「可」とは表示されない)。 let limit = 45 var score = 65 switch score { case limit..<75: print("追試験") case 90 ... 100: print("秀") case 80 ..< 90: print("優") case 70 ..< 80: print("良") case 60 ..< 70: print("可") default: print("不可") } ラベル付きのループ文 †ラベル付きの if 文、 switch 文 †do 文 †コードブロック内で変数や定数を定義した場合、そのコードブロック内でのみ有効となる。 Swift ではC言語のように {} でコードブロックを定義することができない。 そのような場合は Swift では do {} と記述する。 これはエラー処理につかう do - catch 文で catch を記述しないことに相当する。 if a >= 0 { b += a { let t = a; a = c; c = t } // NG } if a >= 0 { b += a do { let t = a; a = c; c = t } // OK } do文にラベルをつけることができる。 lab: do { for i in 0 ..< 10 { c + 3 if c > b { break lab } // do文から脱出する } c = 0 } |