Swift の repeat-while と Kotlin の do-while のスコープの違い
SwiftとKotlinでは、一見似たループ構文に見えても、変数のスコープに関して微妙な違いがあります。
この記事では、Swiftのrepeat-while
ループとKotlinのdo-while
ループにおける変数のスコープの違いについて解説します。
repeat-while
ループ
SwiftのSwiftでは、repeat-while
ループの本体内で宣言した変数は、そのループの条件部分からは参照できません。
例えば、以下のコードはコンパイルエラーとなります。
repeat {
var result = apiResult()
} while result.hasMore
上記のコードでは、ループ内で宣言されたresult
は、while
の条件部分のスコープ外になっているため、
result.hasMore
と記述すると「未定義の変数」を参照しているとみなされエラーになります。
対策
もしループ条件で変数を参照する必要がある場合は、ループ外で変数を宣言してから利用する必要があります。
var result: ResultType
repeat {
result = apiResult()
} while result.hasMore
このようにループ外でresult
を宣言することで、ループ本体内で値を更新し、条件部分でも正しく参照できるようになります。
do-while
ループ
Kotlinの一方、Kotlinではdo-while
ループにおいて、ループ本体内で宣言した変数がループの条件部分でも参照可能となっています。
以下のコードはエラーになりません。
do {
var result = apiResult()
} while (result.hasMore)
Kotlinのdo-while
ループでは、ループ全体が一つのスコープとして扱われるため、
ループ本体内で宣言したresult
がwhile
条件でも有効となります。
まとめ
-
Swiftの
repeat-while
ループ本体内で宣言した変数は、ループ条件部分ではアクセスできないため、条件で利用する場合はループ外で宣言する必要があります。 -
Kotlinの
do-while
ループ全体が同一のスコープで扱われるため、ループ本体内で宣言した変数が条件部分でも参照可能です。
これらの違いを理解して、各言語に適したループの使い方を意識すると、意図しないエラーを回避できます。
Discussion