目的
Swift言語 の switch 文では、整数型だけではなく任意の型を使って条件分岐ができます。ここで独自のクラスを使用する方法を調べてみました。
独自クラスを switch 文に対応させる
独自クラスのインスタンスを使って分岐できるようにする
自分自身と同じクラスのインスタンスと switch 文で比較できるようにするには、クラスが Equatable
プロトコルに準拠している必要があります。
class MyClass : Equatable {
}
func ==(lhs: MyClass, rhs: MyClass) -> Bool {
}
このようにすることで、独自クラスのインスタンスを使って switch による条件分岐ができるようになります。
let obj1 = MyClass()
let obj2 = MyClass()
switch obj1 {
case MyClass():
println("new")
case obj2:
println("obj2")
default:
println("others")
}
リテラルを使って分岐できるようにする
とえば整数リテラルを使って条件分岐したい場合は、独自クラスを Equatable
プロトコルと IntegerLiteralConvertible
プロトコルに準拠させます。
class MyClass : Equatable, IntegerLiteralConvertible {
init() {
}
required init(integerLiteral value: IntegerLiteralType) {
}
}
func ==(lhs: MyClass, rhs: MyClass) -> Bool {
}
このようにすることで、整数値リテラルを使った条件分岐が可能になります。
let obj1 = MyClass()
switch obj1 {
case 1:
println("1")
case 2:
println("2")
default:
println("others")
}
範囲を使って分岐できるようにする
独自のクラスも Comparable
プロトコルを実装することで、case 文で 1...3
のような範囲型を使って条件を記載できるようになります。
ここでは整数リテラルで範囲を指定することを想定して、併せて
IntegerLiteralConvertible
プロトコルにも準拠させておくことにします。
class MyClass : Comparable, IntegerLiteralConvertible {
init() {
}
required init(integerLiteral value: IntegerLiteralType) {
}
}
func ==(lhs: MyClass, rhs: MyClass) -> Bool {
}
func <=(lhs: MyClass, rhs: MyClass) -> Bool {
}
func >=(lhs: MyClass, rhs: MyClass) -> Bool {
}
func >(lhs: MyClass, rhs: MyClass) -> Bool {
}
func <(lhs: MyClass, rhs: MyClass) -> Bool {
}
これで、次のように範囲を使った条件分岐が可能になります。
なお、今回は IntegerLiteralConvertible
に準拠させたため、整数値で表現された範囲で判定しています。これに準拠させなくても、独自クラスのインスタンスで表現された範囲での判定が可能です。
let obj1 = MyClass()
switch obj1 {
case Range(3...5):
println("3 to 5")
default:
println("others")
}
なお、Comparable
プロトコルは Equatable
プロトコルにも準拠しているため、必要な機能を実装すれば、必然的にインスタンス単体での case にも対応します。
今回は IntegerLiteralConvertible
プロトコルにも準拠させているため、整数値リテラル単体での case にも対応することになります。