Swift:switchステートメントでクラス型をテストする


207

Swiftでは、「is」を使用してオブジェクトのクラスタイプを確認できます。これを「スイッチ」ブロックに組み込むにはどうすればよいですか?

それは不可能だと思うので、これを回避する最善の方法は何なのかと思っています。

回答:


437

あなたは絶対に使用することができますisswitchブロック。Swiftプログラミング言語の「AnyおよびAnyObjectの型キャスト」を参照してください(Anyもちろん、これに限定されません)。彼らは広範な例を持っています:

for thing in things {
    switch thing {
    case 0 as Int:
        println("zero as an Int")
    case 0 as Double:
        println("zero as a Double")
    case let someInt as Int:
        println("an integer value of \(someInt)")
    case let someDouble as Double where someDouble > 0:
        println("a positive double value of \(someDouble)")
// here it comes:
    case is Double:
        println("some other double value that I don't want to print")
    case let someString as String:
        println("a string value of \"\(someString)\"")
    case let (x, y) as (Double, Double):
        println("an (x, y) point at \(x), \(y)")
    case let movie as Movie:
        println("a movie called '\(movie.name)', dir. \(movie.director)")
    default:
        println("something else")
    }
}

2
こんにちは、ロブ。ただの好奇心:上記のthingいずれでもin switch` を使用していないcaseので、ここで何を使用するのthingでしょうか?見に行きませんでした。ありがとう。
Unheilig 2015

3
事はそれぞれの場合にテストされている値です。したがって、物事が映画である場合、その値はシンボル映画にバインドされます。
Rob Napier

5
「あなたは絶対に使用できますis」-そして彼はそれを決して使用しません。X)
ラファエル

3
@ラファエルcase is Doubleは答えで見ることができます
ゴベ2017

2
@Gobe私の悪い、それを逃した。:>私の言い訳:多分それは最も説明的な例ではないのですか?
ラファエル

46

「case is- case is Int、is String:」操作の例を挙げます。複数のケースを組み合わせて使用​​して、類似オブジェクトタイプに対して同じアクティビティを実行できます。ここで、タイプを区切る"、"OR演算子のように動作します。

switch value{
case is Int, is String:
    if value is Int{
        print("Integer::\(value)")
    }else{
        print("String::\(value)")
    }
default:
    print("\(value)")
}

デモリンク


11
2つのケースを一緒にして単にそれらを分離するために使用することifは、おそらくあなたの主張を証明するための最良の例ではありません。
警戒心の強い2018年

1
それはおそらく場合は良いだろうvalueの一つとなる可能性があるIntFloatDouble、および治療FloatDouble同じように。
noamtm 2018年

30

値がない場合は、任意のオブジェクトのみ:

迅速4

func test(_ val:Any) {
    switch val {
    case is NSString:
        print("it is NSString")
    case is String:
        print("it is a String")
    case is Int:
        print("it is int")
    default:
        print(val)
    }
}


let str: NSString = "some nsstring value"
let i:Int=1
test(str) 
// it is NSString
test(i) 
// it is int

17

私はこの構文が好きです:

switch thing {
case _ as Int: print("thing is Int")
case _ as Double: print("thing is Double")
}

次のように、機能をすばやく拡張できる可能性があるためです。

switch thing {
case let myInt as Int: print("\(myInt) is Int")
case _ as Double: print("thing is Double")
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.