#author("2016-07-15T06:31:52+00:00","default:nitta","nitta")
#author("2016-07-15T06:37:12+00:00","default:nitta","nitta")
[[Swift]]

*基本 [#b7acfb39]

Java などでは、クラスを実体化したものだけをインスタンスと呼んで、他の基本データ型のデータを区別した。
しかし、Swiftではどのような型であってもデータをインスタンスとよぶ。

*データ型と変数 [#oc6e0f48]

Swiftでは、データ型のほとんどは値型(value type)であり、参照型 (reference type)はクラスのインスタンスとクロージャだけである。
ポインタを表す記述方法はないが、複数の変数から同時に参照されるデータとそうでないデータは区別して考える必要がある。

**基本的なデータ型 [#h408f31c]
|種類|型名|説明|
|整数型|Int|符号つき整数。|
|整数型|UInt|符号なし整数。|
|実数型|Float|浮動小数点数|
|実数型|Double|浮動小数点数。精度が高い。|
|論理型|Bool|リテラルはtrueとfalse。整数型ではない|
|文字|Character|Unicodeの1文字を表す。整数型ではない。|
|文字|UnicodeScalar|Unicodeの文字コードを表す。|
|文字列|String|Uicode文字列。NSStringと互換性があるが、値型データであることに注意。|

**変数と定数 [#ecc81115]


-変数 -- 値を書き換えることができる変数
-定数 -- 初期値を設定したら、値を書き換えることができない(=単一代入)変数

変数の定義
 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型) [#m69d4ab0]
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 [#j1d25295]
配列に格納されるインスタンスは全て同じ型である必要がある。

次の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])
 }

**演算子 [#h990562b]

代入の演算子は値を返さない。
 a = b = 1    // エラー
 if a = b { ... }   // エラー

演算子の両側に空白があるか、どちらにも空白がない場合には、その演算子を二項演算子として解釈される。
 a + b     // 二項演算子
 a+b       // 二項演算子

演算子の左側に空白がない、かつ、右側に空白がある(または区切りがある)場合は、後置演算子として解釈される。
 a++ b    // 後置演算子 

演算子の左側に空白がある(または区切りがある)、かつ、右側に空白がない場合は、前置演算子として解釈される。
 a ++b    // 前置演算子 

Swift言語では自分で演算子を定義できるため、上記のルールとなっている。
 n /(i +1)    //演算子 / と + の前後に空白をいれるか、または空白を取り除くべき

**識別子 [#p2354467]

識別子として ASCII 文字を用いる場合 camel case 方式で名前をつける(語の始まりの文字を大文字で、他の文字を子文字で表す)ことが推奨されている。
-UpperCamelCase -- 型名、クラス名
-lowerCamelCase -- メソッド名、変数名

Objective-C で作成されたプログラムを Swift で使う場合、もしも Objective-C の中で Swift の予約語が使われていた場合は
バッククォート``で囲む。
 var `fallthrough` = 20

**型に別名をつける [#k83539fb]
既存の型名や、自分で定義したクラスや構造体の名前に別名をつける場合は、typealiasを使う
 typealias SInteger = Int32

*制御構文 [#f47559e5]

**if文 [#e59052ba]

 if 条件節 {
   文...
 } else if 条件節 {
  文...
 } ese {
  文...
 }

次の文は同じ意味となる。
 if a >= 0 {
   b = a
 } else {
   b = -a
 }

 b = a>= 0 ? a: -a

**while文 [#c16ae8f5]

while 条件節 {
 while 条件節 {
   文...
 }

** repeat - while 文 [#q01d3c44]
 repeat {
   文...
 } while 条件節

** for 文 [#k95ac9e7]

 for 初期化; 条件式; 更新 {
   文...
 }

 (例)
 for var i=0; i<10; i=i+1 {
   print(i)
 }

** for - in 文 [#ld615b86]

 for 定数名 in 式 [where 式] {
   文...
 }

 (例)
 for i in 0..<10 {
   print(i)
 }

forの後に書かれた定数名は、暗黙のうちに let が記述されているものとして扱われる。

範囲演算子
- A..<B  ---  A≦x<B
- A...B  ---  A≦x≦B

 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 文 [#p0022a2b]

-分岐に用いる値がいずれかの分岐先に必ず一致しなくてはいけない。
-分岐先の文の実行が終了するとswitch文が終了する。C言語のswitch文のようにそのまま下には抜けることはない(自動的にbreakするようなもの)。
-分岐に用いる値の型に、文字列や構造を持つ型も利用できる。
-必要に応じて、caseに条件を記述できる。

 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("不可")
 }


** ラベル付きのループ文 [#t8850a87]

** ラベル付きの if 文、 switch 文 [#ye95baa3]

** do 文 [#t90e940c]
コードブロック内で変数や定数を定義した場合、そのコードブロック内でのみ有効となる。

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
 }

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS