🚗

Swiftのラベル付き構文(Labeled Statemet)について

2023/12/10に公開

これは、SwiftWednesday Advent Calendar 2023の10日目の記事です。

はじめまして。
iOSエンジニアの@h1d3mun3です

今回は、Swiftで使われるラベル付き構文について調べたのでブログ記事にします。

ラベル付き構文とは

Swiftのラベル付き構文とは下記のようなコードを指します。

func randomEvenTest() {
    var result = ""
    logData: while result == "" {
        defer {
            print("------")
        }
        print("Loop Started!!!!")
        let randomed = Int.random(in: 0...10)
        print("Generated Randomed value is \(randomed)")
        if randomed % 2 == 0 {
            result = "\(randomed)"
            print("Randomed Value is even number")
            print("Early Exited!")
            break logData
        }
        print("Randomed Value is odd number")
        print("loop executed! will continue")
    }
    print("Generated Even Number Result is \(result)")
}

このプログラムは下記のような処理を行います。

  1. 0...10の範囲で乱数を生成
  2. 偶数かどうかを判定
    2.a 偶数の場合は、結果をResultに格納してループを終了
    2.b 奇数の場合は、ループを再実行
  3. 最後に生成したResultを標準入出力から出力

下記のような出力になります。

Loop Started!!!!
Generated Randomed value is 9
Randomed Value is odd number
loop executed! will continue
------
Loop Started!!!!
Generated Randomed value is 3
Randomed Value is odd number
loop executed! will continue
------
Loop Started!!!!
Generated Randomed value is 3
Randomed Value is odd number
loop executed! will continue
------
Loop Started!!!!
Generated Randomed value is 9
Randomed Value is odd number
loop executed! will continue
------
Loop Started!!!!
Generated Randomed value is 8
Randomed Value is even number
Early Exited!
------
Generated Even Number Result is 8

ラベル付き構文の特徴

この処理は下記のようなコードの処理とほぼ同じですが、

func randomEvenTestNonLabeledStatement() {
    var result = ""
    while result == "" {
        defer {
            print("------")
        }
        print("Loop Started!!!!")
        let randomed = Int.random(in: 0...10)
        print("Generated Randomed value is \(randomed)")
        if randomed % 2 == 0 {
            result = "\(randomed)"
            print("Randomed Value is even number")
            print("Early Exited!")
        }
        print("Randomed Value is odd number")
        print("loop executed! will continue")
    }
    print("Generated Even Number Result is \(result)")
}

ラベル付き構文を利用する場合、判定フローの 2.aに入ったときに、現状実行中のループから直接抜けられることがメリットになります。

例えば3重、2重のforやwhile文ループがあるときに、この特徴を利用することで、高度な繰り返し処理を実現することができます。

個人的には言語機能として悪くはないと思いましたが、このような制御を行う場合はもう少し別の形で行いたいと思いました。

参考資料

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/controlflow/#Labeled-Statements
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/statements/#Labeled-Statement

Discussion