競技プロで得たSwiftのTipsを...

## モチベーション
Swiftの文法や効率的な書き方を学ぶために最近少し競技プログラミングをしています！

そこで得た「こんな書き方があるんだ〜」を随時まとめていきたいと考え、自分の知識の積み重ねと共有という意味で記事にしてみました！

:::note info
この記事はこんな人におすすめ

- Swiftの文法等には多少慣れてきたけど、他の書き方を模索したい方
- 競プロをSwiftではじめたての方
- Swiftを個人開発もしくは業務でも書く方　 ＃全員やないかい
:::



:::note warn
警告
必ずしも当記事でのコーディングを推奨するものではなくあくまでも、実装の引き出しを増やすための一助になればいいと考えているので、「こんな書き方があるよ！」や「この方が実行スピード早いよ！」等のコメントは勉強になりますので、ぜひご教示いただければ幸いです！
:::

## 詳細
入力・出力・番外編として大きく3つに分けて解説していきます！！
おそらく適宜、他の学びも追記していきます！

### 入力編

##### 配列に入力する簡単な方法

[Int]をfor-in文を使用せずに1行でサクッと作成したい時

```Main.Swift
 let N = 5
 var intList: [Int] = []

 // Before
 for i in 0..<N {
     intList.append(i)
 }

 print(intList) // [0,1,2,3,4]

 // After
 var intList2 = (0..<N).map { $0 }

 print(intList2) // [0,1,2,3,4]

```
for-inではなく、mapを使用して配列を生成することで、最初に空のIntの配列（上記でいうところの、intList）を作成しなくても済むので行数が減りますね！

##### 1~26までの数字を使用してN番目のアルファベットを取得する方法

```GetAlphabetです。.Swift
 let N = 5
  // 数字を引数で渡すとアルファベットを返せる関数
 func getAlphabetFrom(_ number: Int) -> String {
     // 1~26の間でない場合は、"-"のように適当な文字列を取得
    guard (1...26).contains(number) else { return "-" }
    // 小文字のアルファベットにしたいときは以下を"A"→"a"
    let unicodeValue = UnicodeScalar("A").value + UInt32(number) - 1 
    return String(UnicodeScalar(unicodeValue)!) // !は不要かも...
  }

  // 例えば、以下のような感じ
  print(getAlphabetFrom(1)!) // "A"
  print(getAlphabetFrom(26)!.lowercased()) // "z"
  print(getAlphabetFrom(0)!) // "-"

```

いつ実務で使用するんや...？というようなコードですが、UnicodeScalarは奥が深そうだなと感じますね！

### 出力編

#### 配列の要素を結合して出力する

```結合して出力.Swift

let stringList = ["A","B","C"]
print(stringList) // ["A","B","C"]
print(stringList.joined()) // ABC

let penguinList = ["p","e","n","g","u","i","n"]
print(penguinList.joined()) // penguin 　　🐧 （※絵文字は出力されません。）
```

上記のように入力で特定の文字列が用意されている場合に、結合して文字列を出力するには便利です！

#### 配列内の数字を全て足し算する方法

```計算してくれ.Swift

let intList = [10, 10, 10]
let sum = intList.reduce(0, +)
print(sum) // 30 Int

```

以下のように応用もできるので便利です！

```計算してくれ応用ver.Swift

let intList = [10, 10, 10]
let sum = intList.reduce(1, *)
print(sum) // 1000 Int

```

要素を全て結合して出力したり、シンプリに結合だけさせたいというときに使用できますね！


### 番外編

#### 与えられた数字が奇数か偶数であるかを判別する方法

```割り切れるのかい？.Swift

func isMultiple(of other: Self) -> Bool
let isEven = ten.isMultiple(of: 2) // `true`なので、偶数
let isOdd = nine.isMultiple(of: 2) // `false`なので、奇数
print(isEven, isOdd) // true, false
```

少し前までは、`2 % 2 == 0 true`のような書き方していましたが、isMultiple(of: n)関数が使用できると知ってから、すぐに奇数が偶数かを判別する処理を実装できるようになりました！

業務で言うと、12秒ごとの処理を走らせる実装した(`12 % 12 == 0 true`)ので、その箇所を`isMultiple(of: 12)`のような書き方に変更して、実装できそうです！


## さいごに
この記事は随時追記していきますが、最初に投稿した段階で感じたことは、実務では使用しなさそうな関数や実装方法が無限にあって競プロを通じてSwiftで実装する引き出しが段違いに増えたと思いますし、実装を行う前にデータの扱い方や設計的なものがよりスムーズに明確に頭に浮かぶようになったかもしれません！

2024/1/14時点では、Swiftに関する知識をより深めて、アルゴリズムとデータ構造についての理解を深めて業務に役立てられればと考えています！

また、今の所SwiftでATCoderに参加していますが、やはり回答はC＋＋やPythonが圧倒的に多いので、今後はそれらで実装することも視野に入れたいなとも感じました〜！

## 参考記事
https://qiita.com/kntkymt/items/4f02c6b90462f354de6d

https://zenn.dev/koher/articles/swift-cheatsheet-for-competitive-programming


#### 公式リファレンス
joined()

https://developer.apple.com/documentation/swift/array/joined()


Unicode.Scalar

https://developer.apple.com/documentation/swift/unicode/scalar

UnicodeScalar

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

reduce(x,y)

https://developer.apple.com/documentation/swift/array/reduce(_:_:)

isMultiple(of:)

https://developer.apple.com/documentation/swift/int/ismultiple(of:)