Swift Language Guide "The Basics"

The Swift Programming LanguageのLanguage Guideの"The Basics"の章をざっとまとめたものです。

Objective-Cを始め、既に他の言語を習得されてる方向けです。
英語は苦手なので、ソースコードから逆読みしている箇所もあります。
間違いや補足等あれば、教えて頂ければ幸いです。

[次章 Basic Operators](http://qiita.com/hmu29/items/9c88f775211cb0507438)

# 文末

行末又はセミコロンまでが文。行末のセミコロンは必須ではない.

# 定数

```Swift
let 定数名 = 定数値 // 型推論
let 定数名: 型 = 定数値 // 型明示
```

定数名の先頭は、小文字でも大文字でもかまわない。

```Swift
let ZERO = 0
let ONE:Int8 = 1 // 型を明示した場合
let PATH = "a/b/c"
```

## 要調査

```Swift
// クラスの属性定義
let ZERO;

// クラスのコンストラクタか何かで、定数の初期値を設定することは可能？
ZERO = 0;
```

# 変数

```Swift
// 型推論
var 変数名 = 10
// 型明示
var 変数名: 変数型
```

```Swift
var name = "hmu29"
name =  "hmu30"
```

# 識別子

変数名や定数名には、
- Unicodeが使える。
- 数字から始まってはいけない。

# 標準出力

グローバル関数printlnを使う。

```Swift
println("hello world!")
message = "hello world!"
# \(変数名)で文字列中で変数の展開が行える。
println("message = \(message)")
```

# コメント

ブロックコメントはネストも解決してくれるっぽい。

```swift
// インラインコメント
/*
 ブロックコメント
 */

/*
 /* これもコメント */
 これもコメント!!
 */
```

# Integer 整数

## 型

- UInt8
- Int32
- Int64
- Int ... 32bit platform=>Int32. 64bit platform=>Int64.
- UInt32
- UInt64
- UInt ... 32bit platform=>Int32. 64bit platform=>Int64. 

## 最大値　最小値

```Swift
let min = Int32.min
let max = Int32.max
```

## 定数値

## 整数

- プレフィックス無し... 整数
- プレフィックス0b ... 2進数
- 0o ... 8進数
- 0x ... 16進数

## 浮動小数点

10進数に対して
```Swift
1.25e2 // 1.25 x 10^2 or 125.0
1.25e-2 // 1.25 x 10^2 or 0.0125.
```

16進数に対して
```Swift
- 0xFp2 // 15 x 2^2 or 60.0
- 0xFp-2 // 15 x 2^-2 or 3.75.
```


## 桁区切り

_で桁を区切れる.

```Swift
let million = 3_000_000
```

# Float 浮動小数点

## 型

- Double ... 64bit
- Float ... 32bit

# 型セーフ

Swiftは型セーフな言語。(コンパイル時に型チェックを行う)

# 型推論

Swiftは変数や定数の初期値に応じて型を推論する

```Swift
let たぶんInt = 10 // 整数値はIntと推論
let pi = 3.14 // 浮動小数点はDoubleと推論
```

# 型変換

## 整数値

変数、定数にその範囲外の値を入れる事はできない。

```Swift
let val1: Int8 = Int8.max + 1 // コンパイルエラー
```

```Swift
let val1: Int8 = Int8.max
var str = "127"
var val2 = str.toInt()
var val3: Int8 = Int8(val2!) // これはOK val3 == 127

// これは例外発生
var val4: Int8 = val1 + Int8(val2!)
```

## 浮動小数点->整数

Int()などでキャストできる

```Swift
let val = Int(3.14)
```

# 型エイリアス

いわゆるtypedef.

```
typealias AudioSample = Unit16
```

# Boolean

型名はBool型
値はtrue 又は　false

if などの制御文内の式は、Booleanでないとダメ

```Swift
let success = true
if success {
 // 必ずここを通る
}

if 1 {
 // 1 はコンパイルエラー
}

if 1 == 1  {
 // 1 == 1 はtrue なのでOK
}
```

# タプル

値の組み合わせを定義できる。
Laungauge guideにも一時的なスコープで利用する場合に便利とある

便利そうだけど、便利過ぎそう。。。
特にタプルの要素に名称を付けるなら、
構造体なりにした方が型的に安全なのでは...と感じる。

```Swift
let http404Error = (404, "Not Found")

// タプルを展開
let(statusCode, message) = http404Error
println("code=\(statusCode), msg=\(message)")

// タプルの一部のみ展開
// 省略部を_で指定する
let(statusCode, _) = http404Error
println("code=\(statusCode)")

// 0. 1とインデックスでもアクセスできる
println("code=\(http404Error.0), msg=\(http404Error.1)")

// タプルに名称を指定もできる
let http404Error = (statusCode:404, message:"Not Found")
println("code=\(http404Error.statusCode), msg=\(http404Error.message)")
```

# optional (nil許容)

Int型の変数などでnilを許容する場合にInt?型が使われる.

※ C#などでもSQLの実行結果を格納する際にnil許容型があったけど、そんな感じに利用するする?

```Swift
let possibleNumber = "123"
let convertedNumber = possibleNumber.toInt()
// toIntはInt?を返す.

// Int?型は、変数の接尾辞が無指定の場合はnilかどうかを表し
if convertedNumber {
  // 変数の接尾辞に!がつくと、その値を参照する.
  // これをForced Unwarppingというらしい.
  println("number=\(convertedNumber!)")
} else {
 println("error!!")
}
```

## 変数の型にInt?を指定する事もできる

```Swift
var result: Int? = 100
result = nil
```

# nil
objective-cとは異なり、nilはポインタではない.オブジェクトが存在しない事を意味しない.

(...オブジェクトが存在しない、という意味のnilは何になったんだろう...)

# Implicitly Unwapped Optionals

Int?ではなくInt!を使う事で、変数名!でなく、変数名のみでUnwrapped状態にしてくれる。(文法的にはC++のリファレンスみたいな?)

※ 変数に値が存在する事を前提する場合に、!が省略できて便利...?
　いまのところ使い道が?

```Swift
var val: Int! = 32
println(val=\(val))
```

nilチェックも可能

```Swift

let val: Int? = nil
if val {
  println(true)
} else {
  println(false) // falseが出力される
}
```

# Assert

メソッド処理時のオブジェクトの状態チェックや、引数のチェック、
処理後の状態チェックに使ったりする。

デバッガで実行時には、Assertの結果がfalseになると、そこで処理を止めてくれる。

```Swift
let age = -3
assert(age >= 0, "error message")
```

※ Swiftでは未確認だけど、Cの場合、非デバッグ時には、assertは無視されるので、一般的にassert中で、副作用のある処理（変数に値を代入したりなど）を行うのはNG.

------

[次章 Basic Operators](http://qiita.com/hmu29/items/9c88f775211cb0507438)