LoginSignup
11
5

【Swift】case-letによるパターンマッチをループする

Last updated at Posted at 2020-10-25

この記事はなに?

Appleのサンプルコードを読んでいる時に見かけない構文を見つけたので、調べました。

サンプルコードの一部
for case let foundObject as VNRecognizedObjectObservation in results {
    let bestLabel = foundObject.labels.first!	
    let objectBounds = foundObject.boundingBox
    print(bestLabel.identifier, bestLabel.confidence, objectBounds)	
}

気になったのは、1行目です。
for case let foundObject as VNRecognizedObjectObservation in results
コレクションに対して、処理を反復していることは理解できましたが、case let x as T が謎でした。
ちなみに、このサンプルコードは、Visionフレームワークを使った画像認識アプリです。
resultsには、Visionによる検出結果が並んでいると思われます。

Swiftを基礎から学ぶには
自著、工学社より発売中の「まるごと分かるSwiftプログラミング」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。

マッチした値だけキャストする

単純にしたコードを実行して、動作を確認しました。

実行環境

Xcode 12.1
Swift 5.3
macOS 10.15.7

要素の型が一貫していない配列
let values: [Any] =  [ "1", 2, 3.4]
配列の要素のうち「Int型にキャストできる値」に対してのみ、処理を行う
for case let number as Int in values {
    print(number)
}
// Prints 2

考察

同じ実行結果を得るだけであれば、他にもいろんなアプローチがありそうです。
ただ、Appleのサンプルコードだけあって、極めてシンプルな記述で実装されているのではないかと思います。

11
5
0

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
11
5