🔁

Swift の repeat-while と Kotlin の do-while のスコープの違い

2025/02/18に公開

SwiftとKotlinでは、一見似たループ構文に見えても、変数のスコープに関して微妙な違いがあります。
この記事では、Swiftのrepeat-whileループとKotlinのdo-whileループにおける変数のスコープの違いについて解説します。

Swiftのrepeat-whileループ

Swiftでは、repeat-whileループの本体内で宣言した変数は、そのループの条件部分からは参照できません。
例えば、以下のコードはコンパイルエラーとなります。

repeat {
    var result = apiResult()
} while result.hasMore

上記のコードでは、ループ内で宣言されたresultは、whileの条件部分のスコープ外になっているため、
result.hasMoreと記述すると「未定義の変数」を参照しているとみなされエラーになります。

対策

もしループ条件で変数を参照する必要がある場合は、ループ外で変数を宣言してから利用する必要があります。

var result: ResultType
repeat {
    result = apiResult()
} while result.hasMore

このようにループ外でresultを宣言することで、ループ本体内で値を更新し、条件部分でも正しく参照できるようになります。

Kotlinのdo-whileループ

一方、Kotlinではdo-whileループにおいて、ループ本体内で宣言した変数がループの条件部分でも参照可能となっています。
以下のコードはエラーになりません。

do {
    var result = apiResult()
} while (result.hasMore)

Kotlinのdo-whileループでは、ループ全体が一つのスコープとして扱われるため、
ループ本体内で宣言したresultwhile条件でも有効となります。

まとめ

  • Swiftのrepeat-while
    ループ本体内で宣言した変数は、ループ条件部分ではアクセスできないため、条件で利用する場合はループ外で宣言する必要があります。

  • Kotlinのdo-while
    ループ全体が同一のスコープで扱われるため、ループ本体内で宣言した変数が条件部分でも参照可能です。

これらの違いを理解して、各言語に適したループの使い方を意識すると、意図しないエラーを回避できます。

Discussion