Arrayを特定の型で拡張 in Swift

Array を特定の型で拡張したのでメモ

Array 自体を拡張したら、要素がどの型でもそのメソッドを使えてしまうので、

要素がある型の時だけつけるようにしたかった。

こんな感じで実装したかった。

extension Array<CustomClass> {}`


すると

Constrained extension must be declared on the unspecialized generic type ‘Array’ with constraints specified by a ‘where’ clause

とでたので、

ちょいと調べてみた。

Swift: Protocol requirements

iPhone 界隈では有名なエリカ女子さんがすでに解決していた。

さきほどの Arrayを拡張したいとすると

protocol OnlyCustomClasses {}
extension CustomClass: OnlyCustomClasses {}

のように CustomClass 用のプロトコルを作ってやる。


CustomClass で継承する。

extension Array where Element : OnlyCustomClasses {
    func execute() {
    }
}

あとは Array に適用してやれば、excute は OnlyCustomClasses のプロトコルを継承しているクラスでしか使えない。

ただ、CustomClass のオブジェクトを取得したい場合は、キャストが必要。

エリカ女子は「Inelegant だわ」とおしゃっています。

comments powered by Disqus