はじめに
特定の条件のみのに適応される配列の 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
の条件に合わない使い方をするとコンパイルエラーにしてくれる(実行時エラーにはならない)