Swift 各種構文　メモ

# for文

構文

```swift
for カウンタの変数名 in 範囲　{
    繰り返しの処理
}
```

使用例

```swift
//繰り返しの回数指定(1から10まで)
for index in 1...10 {
    print("index:\(index)") 
}

//配列の要素を列挙
var array = ["きつね","たぬき","たまご"]
for content in array {
    print("中身：\(content)")
}
```

## 繰り返し指定で最後の位置を含みたくない場合(範囲指定)
`..<`を利用する

```swift
//繰り返しの回数指定(1から9まで)
for index in 1..<10 {
    print("index:\(index)")
}
```

## インデックス番号を使用しない時
`_`で省略可能

```swift
for _ in 1..<10 {
    print("Oh!!")
}
```


## for-in-enumerated
インデックス番号と繰り返し項目の要素の両方を使いたい時に便利

構文

```swift
for (インデックスの変数, 項目名) in 繰り返し項目名.enumerated() {
    //繰り返し処理
}
```

使用例

```swift
var muArray = ["せいこ","アララ","きのい"]

for (index, value) in muArray.enumerated() {
    print("\(index):\(value)")
}
```


# if文

```swift
var score = 79

if score > 90 {
    print("天才!!")
} else if 80 <= score && score <= 90{
    print("合格!!")
} else {
    print("残念、不合格!!")
}
```

# switch文
```swift
switch score {
    case 100:
        print("大天才！！！")
    break
    case 80...99: //80~99
        print("合格")
    break
    default :
        print("残念、不合格！！！")
    break
}
```

# 列挙型(enum)
列挙した値の管理に適する。

## 書式
```swift
enum 定義名称: 型名 {
    case 列挙子 = 値
    case 列挙子 = 値
}

## 使用例

```swift
enum GameState: Int {
    case Playing = 1
    case GameOver = 2
}

var state: GameState = GameState.Playing
print(state) //列挙子(Playing)
print(state.rawValue) //列挙子に対応する値(1)
```

## Switch文とenum値を組み合わせて使用する

```swift
enum GameState {
    case Playing = 1
    case GameOver = 2
}

var state = GameState.Playing

//すべてのenum値のcaseを用意しなければならない
switch state {
case .Playing:
    print("ゲーム中")
case .GameOver:
    print("ゲーム終了")
}
```

# while
条件を満たすまでの間ループを繰り返す

```swift
var x = 1
while x < 100 {
    x = x * 2
    print("値は：\(x)です！")
}
```

# guard文
変数に適切な値が入っているかどうかを判別する関数

書式

```swift
guard let チェック後に利用する変数名 = チェックする変数名 else {
    //変数が適切な値でなかった場合の処理
}
```

使用例

```swift
var fullFuel = 100

func checkFuel(fullFuel: Int?) {
    guard let fuel = fullFuel else {
        print("もう走れません")
        return
    }
    print("まだ走れる！")
}

checkFuel(fullFuel: fullFuel)
```


# 値を書き換える構文
## filter 
配列の中から特定の要素のみを取り出したいときに便利

```swift
var numbers = [1,21,522,34,16]

let results = numbers.filter{ (x:Int) -> Bool in
    //100より小さい値のみを取り出す
    if x < 100 {
        return true
    } else {
        return false
    }
}

print("結果:\(results)") //結果:[1, 21, 34, 16]
```


## map
配列の中の特定の値を変更して新たに配列を生成する。

```swift
var numbers = [1,21,522,34,16]
let mapResults = numbers.map{ (x:Int) -> Int in
    //100より小さい値を2倍にして返す
    if x < 100 {
        return x * 2
    } else {
        return x
    }
}

print("結果:\(mapResults)") //結果:[2, 42, 522, 68, 32]
```


## reduce
繰り返し項目(配列等)の値を順次処理する。

```swift
var numbers = [1,21,522,34,16]

let reduceTotla = numbers.reduce(0){ (total:Int, score:Int) -> Int in
    //配列の中身を値を足し合わせる。初期値は0。
    return total + score
}

print("合計値:\(reduceTotla)")
```

また、引数に`$0`、`$1`を利用して簡潔に書くこともできる

```swift
var numbers = [1,21,522,34,16]
let total = numbers.reduce(0, {$0 + $1})
print("合計値:\(total)")
```

## sort 
繰り返し項目の値の並び替え。昇順や降順など。

```swift
var numbers = [1,21,522,34,16]

numbers.sort{ (value1:Int, value2:Int) -> Bool in
    value1 < value2 //昇順にソート
}
print("ソート結果:\(numbers)") //ソート結果:[1, 16, 21, 34, 522]
```

`$0`と`$1`を利用した簡潔な書き方

```swift
numbers.sort{$0 > $1} //降順
print("ソート結果:\(numbers)") //ソート結果:[522, 34, 21, 16, 1]
```

## for-in-where
繰り返し処理内にて、where句を使用することで特定の値のときは処理を行わないみたいなことが可能。


```swift
//インデックス番号が4のときは処理を行わない
for value in 0...10 where value != 4 {
    print("インデックス:\(value)")
}
```