[Swift5]paizaでよく使う文法メモ(初心者向け)

##背景
普段Swift使ってアプリを開発していますが、
「paizaをSランクにしておくといいかも」との助言もあり、ついこの間[paiza](https://paiza.jp/)をやりはじめてみました。

普段使わない文法で慣れていなかったり、そもそもコードのバージョンが古いサイトもあったので、自分用に「paizaでよく使う文法」をまとめました。
参考にどうぞ。

##よく使うコード
###標準入力
```swift
//１行取得 例：1
let input_line = readLine()!

//複数行 
let input_line1 = readLine()!
let input_line2 = readLine()!
let input_line３ = readLine()!

//複数行
var strs = [String]()
for _ in 0..<8 {
   strs.append(readLine()!)
}

//複数行
while let line = readLine() {
    // 入力された行に対する処理
}
```

※7/4追記 
コメント欄で以下の方法を教えていただきました。ありがとうございます。

```swift
//複数行取得
let s = AnyIterator { readLine() }.joined()

//配列で取得（くそ便利）
let arr = Array(AnyIterator { readLine() })
```

###文字列の処理
```swift
//例： 1 3 5 7 → ["1","3","5","7"]
let strs = input_line.split(separator:" ")

//例： 16357 → ["1","6","3","5","7"]
let strs = input_line.map{String($0)}

//例： ["1","3","5","7"] →　[1,3,5,7]
let numbers = strs.map({Int($0)!})
```

補足：「標準入力〜文字列の処理」をこんな関数にしてやると便利かも

```swift
func readInts() -> [Int] {
    return readLine()!.split(separator: " ").map { Int($0)! }
}
```

さて、続き。

```swift
let s = "ぎょうざたべたい"
//前から◯文字取得
s.prefix(3) //ぎょう

//後ろから◯文字取得
s.suffix(2) //たい

//◯文字切り捨て
s.dropLast(2) //ぎょうざたべ

//文字列切り出し m文字目〜n文字目
let i1 = s.index(s.startIndex, offsetBy: 3)
let i2 = s.index(s.startIndex, offsetBy: 6)

s[i1...i2] //ざたべた
s[i1..<i2] //ざたべ
```

```swift 
//文字列結合
let s1 = "はら"
let s2 = "へった"
s1 + s2 //はらへった

let array = ["はら","へった"]
array.joined() //はらへった
array.joined(separator:" ") //はら　へった
array.joined(separator:",") //はら,へった
```

```swift 
//文字列に文字が含まれるか
let s = "はろーSwift"
if s.contains("は"){
  print("OK")
}
```

```swift 
//文字列の一部を置き換え
var s = "はじめましてこんにちは"
if let range = s.range(of:"こんにちは"){
  s.replaceSubrange(range, with: "さようなら") //はじめましてさようなら
}
```

```swift
//大文字・小文字
let a = "swift".uppercased()
let b = "SWIFT".lowercased()
```

```swift
//ある文字列をn個繰り返す
let s = String(repeating: "AB", count: 5)
// "ABABABABAB"
```

###配列初期化
```swift
var a = [String]()
var b = [[String]]()
b.append(["はじ","めまして"])
```

###配列並び替え
```swift
var array = [5,2,6,7,1]
array.sort{$0 < $1} //昇順 [1,2,5,6,7]
array.sort{$0 > $1} //降順 [7,6,5,2,1]
array.reversed() //逆順 [1,7,6,2,5]
```
・sort()は配列を書き換える
・sorted()は配列を書き換えない


###配列絞り込み
```swift
//例:３で割り切れるもののみからなる配列に
let array = [5,2,6,3,1]
array.filter({$0 % 3 == 0}) //[6,3]
```

###配列結合
```swift
let arr1 = [5,2,6]
let arr2 = [3,1]
arr1 + arr2 //[5,2,6,3,1]

//配列に要素を追加
let arr = ["a", "b", "c", "e"]
arr.insert("d", at: 3) //["a", "b", "c", "d", "e"]

//配列末尾に要素を追加
arr.append("←") //["a", "b", "c", "e", "f"]
```


###配列の要素の合計値
```swift
let array = [1, 2, 3, 4, 5]
let result = array.reduce(0) { $0 + $1 } //15
```
このコードだとreduce()の良さが出てない気もしますが。。。


###配列の全要素が条件を満たすかどうか
```swift
//全ての要素が偶数かどうか
let values = [2, 4, 6, 8]

//contains()
let isAllEven = !values.contains { !($0 % 2 == 0) }

//allSatisfy()
let isAllEven = values.allSatisfy { $0 % 2 == 0 }
```
allSatisfy()の方が可読性が高いですね。Swift 4.2でSequenceに追加されたメソッドです。


###配列のindexを取得
```swift
let scores = [8, 6, 1, 62 ,90]

//enumerated()
for (index, score) in scores.enumerated() {
    print("\(index): \(score)")
}

//index(of: )
if let index = scores.index(of: 90) {
    print("index: \(index)")
}

//index(where: )
if let index = scores.index(where: {$0 == 90}) {
    print("index: \(index)")
}
```
enumerated()ですが、インデックスと要素のタプルを返します。

###配列をユニークに
```swift
let array = [3, 4, 2, 2, 1, 5, 1, 3, 4]
let result = array.reduce([], { $0.contains($1) ? $0 : $0 + [$1] })
// [1, 2, 3, 4, 5]
```
三項演算子を使って書いています。
[]に要素をわんこそばのように追加していくイメージです

###絶対値
```swift
let a = abs(-6) //6
```

###累乗
```swift
let a = pow(5.0, 3)
```

###◯進数
```swift
let a = 44
let str2 = String(num, radix: 2)
let str16 = String(num, radix: 16)

//2進数を１０進数に
let int = Int("110110", radix: 2)
```

###最大、最小
```swift
max(1,5,2) //5
min(1,5,2) //2

let h = [65.7, 64.3, 61.1, 67.5, 58.5, 60.3, 64.9]
let max = h.max() //67.5
let min = h.min() //58.5
```

###倍数
```swift
//２の倍数か？
let a = 18
a.isMultiple(of: 2) //true
```

###小数点以下切り捨て・切り上げ・四捨五入
```swift
let a = 3.1
floor(a)   //切り捨て 3.0
ceil(a)    //切り上げ 4.0
round(a)   //四捨五入 3.0

//小数点をずらして整数値に
let b = a * 10
floor(b) / 10   //切り捨て 3
ceil(b) / 10    //切り上げ 4
round(b) / 10   //四捨五入 3
```

###0埋めする format指定
```swift
let num1 = String(format: "%04d", 9) //0009
let num2 = String(format: "%0.3f", 0.2) // 0.200
```


##終わりに
「他にもこれよく使うよ」という文法があったらコメントで教えてくれると喜びます(笑)

一緒にpaizaランクSを目指しましょう！