LoginSignup
12

More than 5 years have passed since last update.

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

Posted at

目的

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/

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12