[iOS] [Swift] Sequence Protocolのサンプルコード（社内勉強会資料）

# はじめに

弊社内の勉強会で、Sequence Protocolの中でも頻繁に使うモノをサンプルコード付きで紹介しました。
ごくシンプルなコードですが、せっかく書いたものを社内だけにとどめることは勿体無いので公開いたします。

参加者に「お題」だけを配って（答えを削って）、ハンズオンなどをやってみると楽しいと思います！:grinning:

# 環境

・Xcode 10.1
・Swift 4.2

# サンプルコード

```swift:Sequence.playground
import UIKit

struct Student {
    var code: String
    var firstName: String
    var lastName: String
    var score: Int
    var fullName: String {
        return firstName + " " + lastName
    }
}

var students = [Student]()
students.append(Student(code: "AB100000", firstName: "Taro", lastName: "Yamada", score: 62))
students.append(Student(code: "AB100001", firstName: "Ichiro", lastName: "Suzuki", score: 81))
students.append(Student(code: "AB100002", firstName: "Hanako", lastName: "Sato", score: 96))
students.append(Student(code: "AB100003", firstName: "Jiro", lastName: "Takahashi", score: 58))
students.append(Student(code: "AB100004", firstName: "Ichiro", lastName: "Tanaka", score: 75))
students.append(Student(code: "AB100005", firstName: "Hanako", lastName: "Yamada", score: 96))

// 70点以上の生徒を抽出する
let filtered = students.filter { (student) -> Bool in
    return student.score >= 70
}
for (i, student) in filtered.enumerated() {
    print("70点以上の生徒\(i+1)人目は\(student.fullName)です。")
}
/*
70点以上の生徒1人目はIchiro Suzukiです。
70点以上の生徒2人目はHanako Satoです。
70点以上の生徒3人目はIchiro Tanakaです。
70点以上の生徒4人目はHanako Yamadaです。
*/

// "コード, フルネーム"という形式の文字列の配列に変換する
let stringArray = students.map { (student) -> String in
    return "\(student.code), \(student.fullName)"
}
stringArray.forEach {
    print($0)
}
/*
AB100000, Taro Yamada
AB100001, Ichiro Suzuki
AB100002, Hanako Sato
AB100003, Jiro Takahashi
AB100004, Ichiro Tanaka
AB100005, Hanako Yamada
*/

// 全生徒の点数を合計する
let total = students.reduce(0) { (total, student) -> Int in
    return total + student.score
}
print("全生徒のScoreの合計は\(total)点です")
/*
全生徒のScoreの合計は468点です
*/

// key=コード、value=フルネームというDictionaryに変換する
let dic = students.reduce(into: [String: String]()) { (dic, student) in
    return dic[student.code] = student.fullName
}
dic.forEach {
    print($0)
}
/*
(key: "AB100000", value: "Taro Yamada")
(key: "AB100001", value: "Ichiro Suzuki")
(key: "AB100003", value: "Jiro Takahashi")
(key: "AB100004", value: "Ichiro Tanaka")
(key: "AB100005", value: "Hanako Yamada")
(key: "AB100002", value: "Hanako Sato")
*/

// Satoが含まれているか？
let existsSato = students.contains { (student) -> Bool in
    return student.lastName == "Sato"
}
print("Satoさんが含まれているか = \(existsSato)")
/*
Satoさんが含まれているか = true
*/

// Yamadaさんの1件目を取得する
let first = students.first { (student) -> Bool in
    return student.lastName == "Yamada"
}
if let first = first {
    print(first.fullName)
} else {
    print("見つかりませんでした")
}
/*
Taro Yamada
*/

// FirstName>LastName順にソートする
let sorted = students.sorted { (student1, student2) -> Bool in
    if student1.firstName == student2.firstName {
        return student1.lastName < student2.lastName
    } else {
        return student1.firstName < student2.firstName
    }
}
for (i, student) in sorted.enumerated() {
    print("FirstName>LastName順の生徒\(i+1)人目は\(student.fullName)です。")
}
/*
FirstName>LastName順の生徒1人目はHanako Satoです。
FirstName>LastName順の生徒2人目はHanako Yamadaです。
FirstName>LastName順の生徒3人目はIchiro Suzukiです。
FirstName>LastName順の生徒4人目はIchiro Tanakaです。
FirstName>LastName順の生徒5人目はJiro Takahashiです。
FirstName>LastName順の生徒6人目はTaro Yamadaです。
*/
```

# 勉強会で使えるリファレンス

サンプルコードで紹介した以外にも、便利なメソッドはたくさんあるかと思います。

[SwiftDoc.org](https://swiftdoc.org/) は、
・サンプルコードが載っている
・一覧性が優れていて探しやすい
ことから、勉強会の教材として使いやすいと思います。

Sequence Protocolの項はこちらになります。
https://swiftdoc.org/v4.2/protocol/sequence/