プロトコル - 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 //エラーになる