Posted at

Swift の switch 文で独自のクラスを使用する

More than 5 years have passed since last update.


目的

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 にも対応することになります。


[詳細] http://ez-net.jp/article/19/r5vQKEVM/DZoH_4gsVj7B/