Swift5.0.1でAtcoder！

すみません。気が早いです。

Atcoderの言語アップデートシートにSwift5.0.1を追加しておいたので，追加されてくれ...！！！

c++のコレはSwiftでこう書くってのをまとめます。随時更新

---

### std:cin, scanf

これないです（草）

Swiftの場合，標準入力は `readLine()` のみになります。演算子を自作して配列をタプルで返却させることで同じような書き方ができます。

**追記：Stringにsplitがあった**

```swift
import Foundation
prefix operator *
prefix func *　<T> (a: [T]) -> (T, T) {return (a[0], a[1])}

// let (a, b) = *readLine()!.components(separatedBy: " ").map({Int($0)!})
let (a, b) = *readLine()!.split(separator: " ").map({Int($0)})
print(a, b)

// 入力：1 4
// 出力：1 4
```

3つのタプル版が欲しい時は，増やしましょう

```swift
prefix func * <T> (a: [T]) -> (T, T, T) {return (a[0], a[1], a[2])}
```

---

### std:cout, printf

`printf` みたいにフォーマットしたい時は `String` を間に挟む必要があります。

```swift
let hoge = 1, huga = 2
// std:cout
print(hoge) // 出力：1\n
// printf
print(String(format: "%03d", hoge)) // 出力：001\n
print(String(format: "%03d", hoge), terminator: "") // 出力：001
print(hoge, huga) // 出力：1 2
print(hoge, huga, separator: "!") // 出力：1!2
```

`print` の引数として `terminator: 最後にprintする文字列` , `separator: 項目間にprintする文字列` を与えることができるので，改行なしや指定文字で区切る等ができます。

---

### if, for, while

条件は `()` で囲まなくて良いが，コードブロックは `{}` で必ず囲む

```swift
// if
if 条件 {処理} else if 条件 {処理}
// while
while 条件 {処理}
// do-while
repeat {処理} while 条件
// for
for 定数 in 式 option(where 条件式) {処理}

// 0から9を表示する
for i in 0..<10 {print(i)}
```

ちなみに範囲演算子 `..<` は以上未満で， `…` は以上以下です。

---

### switch

swiftにもswich-caseがあります。

※breakが要りません

---

### 配列 Array

Swiftの配列 `Array` は可変長なので `vector` みたいに使えます

```swift
// 宣言
var a: [Int] = [1, 2, 4, 5, 0]
var b: [Int] = []
var c = Array<Int>()
```

どれでもいい

対応は下記の通り

```
vector<int> cpp(5, 0);
var swift = [Int](repeating: 0, count: 5)

cpp[n]                    swift[n]
cpp.size()                swift.count
cpp.push_back(T)          swift.append(T)
cpp.pop_back()            swift.removeLast()
cpp.front()               swift.first!
cpp.back()                swift.last!
cpp.erase(cpp.begin()+n)  swift.remove(n)
```

詳しくは↓

https://developer.apple.com/documentation/swift/array

---

### 辞書 Dictionary

```swift
var a = ["Swift": 2014, "Objective-C": 1983]
var b: [String: Int] = [:]
var c = Dictionary<String, Int>()
```

`a["key"]` のようにアクセスします。ただし返り値はオプショナルになります。

詳しくは↓

https://developer.apple.com/documentation/swift/dictionary

---

### pair

Swiftにはpairがないです。そのため，自前で実装するかタプルを使います。



例題：[ABC131-D](https://atcoder.jp/contests/abc131/tasks/abc131_d)

これは締め切りが早い順に片付けるのが想定解です。Atcoderの解説PDFではc++でpairを使っています。

```swift
import Foundation

prefix operator *
prefix func * <T> (a: [T]) -> (T, T) {return (a[0], a[1])}

func readInt() -> [Int] {return readLine()!.components(separatedBy: " ").map({Int($0)!})}

func main() {
    let N = Int(readLine()!)!
    var tasks: [(Int, Int)] = []// タプルを使ってタスクを持つ
    for _ in 0..<N {
        tasks.append(*readInt())
    }
    tasks.sort(by: {return $0.1 < $1.1}) // returnは無くてもいい
    var isYes = true
    var sum = 0
    for (a, b) in tasks {
        sum += a
        if sum > b {
            isYes = false
            break;
        }
    }
    print(isYes ? "Yes" : "No")
}
main()
```

タプルのソートをする場合，クロージャでどう入れ替えるかを渡す必要があります。

True になるようにソートされるので，この場合昇順です。

あ，サンプルしか動かしてないのでわかんないです。





## おわり

とりあえずこれだけわかってればABC-Cまでは解けるんじゃないですかね？