はじめに
特定の条件のみのに適応される配列の extension を記述したい場合がありました。
調べたところ where を用いるとうまく表現することができたのでそれの紹介になります。
環境:Xcode 12.5.1
やりかた
例: Int の配列のみに適応される extension を書きたい場合
import Foundation
extension Array where Element == Int {
func doublePrint() {
self.forEach { print($0 * 2) }
}
}
let intArray = [1, 2, 3]
intArray.doublePrint()
// 出力
// 2
// 4
// 6
let strArray = ["1", "2", "3"]
strArray.doublePrint() // ← これはコンパイルエラーになる
let strAndIntArray: [Any] = ["1", "2", 3]
strAndIntArray.doublePrint() // ← これもコンパイルエラーになる
ポイント
-
extensionとwhereで条件を絞ることができる(Protocolの拡張などでも用いる技) -
Arrayの場合Elementで要素の型を得られるのでextension Array where Element == "型名"などで絞ることができる -
whereの条件に合わない使い方をするとコンパイルエラーにしてくれる(実行時エラーにはならない)