プロトコル - Ryuya-777/note GitHub Wiki

プロトコル種類

Sequenceプロトコル

forEach(_:)メゾット

要素に対して順次アクセスする。

let array = [1,2,3,4,5,6]

var newArray = [] as [Int] //配列はデフォでAny型。as [Int]でダウンキャストする必要がある。
array.forEach({ element in newArray.append(element) })

newArray //[1, 2, 3, 4, 5, 6]

filter(_:)メゾット

指定した条件を満たした要素のみシークエンスして返す 下記は2で割れる値を定数filteredに代入する

let array = [1,2,3,4,5,6]

let filtered = array.filter({ element in element % 2==0 })
filtered //[2, 4, 6]

map(_:)メゾット

全ての要素に共通の処理を行える。 下記は配列の全ての要素を倍にして定数doubledに代入

let array = [1,2,3,4,5,6]

let doubled = array.map({ element in element * 2})
doubled//[2, 4, 6, 8, 10, 12]

下記はInt型をString型に変換。これ結構便利かも

let array = [1,2,3,4,5,6]

let converted = array.map({ element in String(element)})
converted //["1", "2", "3", "4", "5","6"]

flatMap(_:)メゾット

全ての要素をシークエンスへと変換し、それを1つのシークエンスに結合する。 下記では要素1を[1,2]、要素4を[4,5]、要素7を[7,8]へ変換している。

let a = [1,4,7]
let b = a.flatMap({value in [value, value + 1]})
b//[1, 2, 4, 5, 7, 8]

同じことをmap(:)メゾットで実行すると二重に包まれたIntになる。 flatMap(:)メゾットはネストしたシークエンスを「平に」してくれる。

let a = [1,4,7]
let b = a.map({value in [value, value + 1]})
b//[1, 2], [4, 5], [7, 8](/Ryuya-777/note/wiki/1,-2],-[4,-5],-[7,-8)

compactMap(_:)メゾット

変換できない要素を無視してシークエンスしてくれる。 下記はIntに変換できる[123, 456]のみInt型に変換している

let strings = ["abc","123","dfg","456"]
let integers = strings.compactMap({value in Int(value)})
integers//[123, 456]

reduce(_:)メゾット

要素を1つの値にまとめる 第一引数に初期値を指定し、第二引数に要素を結果に反映する処理を記述する。

let array = [1,2,3,4,5,6]

let sum = array.reduce(0, { result, element in result + element })
sum //21

初期値でデータ型が推論される。

let array = [1,2,3,4,5,6]

let concat = array.reduce("", {result, element in result + String(element)})
concat //"123456"

Collectionプロトコル

サブスクリプトで要素にアクセスできる。 配列の場合は型関係なくアクセスできる。

let array = [1,2,3,4,5,6]

array[3] //4
array.isEmpty //false
array.count //6
array.first //1
array.last //6

配列意外のInt型はエラーになるかも

var a = ""
var b = 1

a.isEmpty //true
b.isEmpty //エラーになる