#Swift
#初心者
#備忘録
#Generics
#protocol

SwiftでGenerics 仮型引数に複数protocol制約を付与する

More than 1 year has passed since last update.

Outline

JavaのGenericsをSwiftで似たように表現する方法を調べました。
わかりやすいようにJavaと合わせて書きます。

やりたかったこと

Javaで可能な仮型引数に複数Interface制約
Hoge<T:InterfaceA & InterFaceB>を実現したかった。

結論

Swift3以降では Javaと構文としては同じだった。

Container.swift
// Swift3
struct Container<T:ProtocolA & ProtocolB> {
    var val:T
}
ContainerOldSyntax.swift
// Swift2 old syntax これでも可
struct Container<T> where T:ProtocolA, T:ProtocolB {
    var val:T
}
Method.swift
class Hoge {
    func someMethodA<T:ProtocolA & ProtocolB>(val:T) {
    }
    func someMethodB<T>(val:T) where T:ProtocolA & ProtocolB {
    }
}

感想
Java Interfaceと似ている。
ただしできないこともあるので、Android/iOSで共通のAPIを持つそれぞれのライブラリを作成するときには要注意。