Swiftのきほん

(随時更新)
公式の[Swift Development Resources](https://developer.apple.com/swift/resources/)を参考にしています。

#単純な変数
## 変数と定数
varを使えば変数、letを使えば定数を定義できる。

```swift
var hogeVariable = 1
let hogeConstant = 2
```

### 型について
変数や定数に代入される値によって暗黙的(implicitly)に型が予測される。

```swift
var implicitInt = 2
    -> Int型
var implicitDouble = 7.0
    -> Double型
```

明示的(explicitly)に型を宣言する場合、「:(セミコロン)」をつかって`var 変数名: 型名`とする。

```swift
var explicitFloat: Float = 4
    -> Float型
```

#### 変数の型を確認する方法
`type(of: )`を使用する。

```swift
(dynamicTypeやString(describing: )は使わない)
var hoge = "notHoge"
print(type(of: hoge))
    -> String
```

#### 型変換は暗黙的に行われない
一度宣言した変数の値をあとから異なる型に変換したい場合は、明示的に変換したい型のインスタンスを作る必要がある。

```swift
var label = "Width is "
var width = 100

print(label + width)
    -> error: binary operator '+' cannot be applied to operands of type 'String' and 'Int'

print(label + String(width))
    -> "Width is 100"
```

文字列の中に数値型の値を入れる場合、インスタンスを生成しなくても「\(バックスラッシュ)」をつかって`\(変数名)`とする方法もある。

```swift
var apples = 3
var pineapples = 2

var appleSum = "I have \(apples) apples."
    -> "I have 3 apples"
var fruitSum = "I have \(apples + pineapples) pieces of fruit."
    -> "I have 5 pieces of fruit."
```

#### 複数行の文字列を扱う方法
「”(ダブルクォーテーション)」を３つ並べて`""" 文字列 """`と囲ってあげる。

```swift
var mailContent = """
Hi,bro.
It has been a long time.
How is everything?
"""
```

### 辞書型と配列
配列と辞書型の宣言には「[ ](ブラケット)」を使い、要素にアクセスするにはインデックスやキーを[ ]内に書く。
コンマは最後の要素のあとにも書くことができる。

```swift
var shoppingArray = ["banana", "milk", "nuts", "salmon",]
    ->["banana", "milk", "nuts", "salmon"]
print(shoppingArray[2])
    -> "nuts"

var presidentsDictionary = [
    "Shinzo": "Japan",
    "Trump": "America",
    "Putin": "Russia"
    ]
    ->["Shinzo": "Japan","Trump": "America", "Putin": "Russia"]
print(presidentsDictionary["Shinzo"])
    -> "Japan"
```

#### 空の配列と辞書
空の配列や辞書型の変数を宣言する場合は、初期化する構文を使う。

```swift
var emptyArray = [String]()
    -> []
var emptyDictionary = [String: Float]()
    -> []
```

配列と辞書型の変数がすでに宣言されていて、型が明らかな場合は以下の方法で空にすることが可能。

```swift
var shoppingArray = ["banana", "milk", "nuts", "salmon"]
shoppingArray = []
    -> [] //Array<String>

var presidentsDictionary = ["Shinzo": 63, "Trump": 71, "Putin": 65]
presidentsDictionary = [:]
    -> [:] //Dictionary<String, Int>
```

# 処理の操作
`if`や`switch`を使えば条件分岐、`for-in`や`while`や`repeat-while`を使えばループ処理ができる。
処理を記述する部分は**「{ }(中括弧)」**で囲う。

```swift
let memberScore = [5, 7, 3, 9]
var teamScore = 0

for score in memberScore {
    if score > 5 {
        teamScore += 2
    } else {
        teamScore += 1
    }
}

print(teamScore)
    -> 6
```

## if文
### ifの条件式は常に論理式
暗黙的に0と比較しようと` if 変数 {…} `と書くとエラーになる。

```swift
var hogeScore = 100
if hogeScore {
    print("Not safety")
}
    -> error: 'Int' is not convertible to 'Bool'
````

### ifとletでオプショナル型の表現(Optional Binding)
オプショナル型の変数は「値が含まれている」、「nil」のどちらもいける両刀使い。
オプショナル型の変数を宣言するには型の後ろに「?」をつける。

```swift
var optionalString: String? = "I'm opptional!"
print(optionalString == nil)
    ->false
```

ifとlet(varでも可能)を組み合わせることで変数に値があるか、欠けている(nil)かで条件分岐。
オプショナル型変数に値が含まれていればアンラップされた値が変数に代入され、変数が`nil`なら`false`となって処理はスキップされる。

#### 変数に値がある場合

```swift
var userName: String? = "Sota"
var greeting = "Hello!"

if let name = userName {
    greeting = "Hello, \(name)"
}

print(greeting)
    -> Hello, Sota
```

#### 変数に値がない(nil)場合

```swift
var userName: String?
var greeting = "Hello!"

if let name = userName {
    greeting = "Hello, \(name)"
}

print(greeting)
    -> Hello!
```

### オプショナル型にデフォルト値を与える
`??`オペレータを使うことで値が`nil`の場合のデフォルト値を与えることができる。

```swift
var userName: String? = nil
let anonymName: String = "Nanashi"
var greeting = "Hi \(userName ?? anonymName)"

print(greeting)
    -> Hi Nanashi
```

## Switch文
Switchはあらゆる値、比較演算に対応している。
`default`ケースを設定しないと「網羅的でない」としてエラーになる。
where句を使い`let 変数 where 条件式` (`var 変数`でもok)とすることで、特定の条件を指定して処理を行うことも可能。
(`.hasSuffix()`メソッドは、引数の文字列が変数内の文字列の「末尾」に含まれていればTrueを返す)

```swift
import Foundation //.hasSuffixのためにインポート

var userJob = "Unemployed"
switch userJob {
    case "Office Worker":
        print("Soso")
    case "Entreprenuer", "Investor": //カンマ区切りでor
        print("Money Happy Pesron")
    case let x where x.hasSuffix("employed”):
        print("Are you Unemployed?")
    default:
        print("Enter your Job!")
}
    -> "Are you Unemployed?"
```