PromiseKitを使用して Promise を処理する Swift ベースの iOS アプリケーションを構築しています (問題の解決が容易になる場合は、Promise ライブラリの切り替えを受け入れます)。ファイルの上書きに関する質問を処理するために設計されたコードのセクションがあります。
おおよそ次のようなコードがあります。
let fileList = [list, of, files, could, be, any, length, ...]
for file in fileList {
if(fileAlreadyExists) {
let overwrite = Promise<Bool> { fulfill, reject in
let alert = UIAlertController(message: "Overwrite the file?")
alert.addAction(UIAlertAction(title: "Yes", handler: { action in
fulfill(true)
}
alert.addAction(UIAlertAction(title: "No", handler: { action in
fulfill(false)
}
} else {
fulfill(true)
}
}
overwrite.then { result -> Promise<Void> in
Promise<Void> { fulfill, reject in
if(result) {
// Overwrite the file
} else {
// Don't overwrite the file
}
}
}
ただし、これは望ましい効果がありません。for ループは、リストを反復処理するのと同じ速さで「完了」します。つまり、UIAlertController は、ある質問を別の質問に重ねようとして混乱します。私が望むのは、ユーザーが「はい」または「いいえ」を選択した場合 (および後続の「上書きする」または「上書きしない」コードが実行された場合) にのみ、 for の次の反復を実行するように、約束を連鎖させることです。ループが発生します。基本的に、シーケンス全体をシーケンシャルにしたいのです。
配列の長さが不定であることを考慮して、これらの約束を連鎖させるにはどうすればよいですか? 明らかな何かが欠けているように感じます。
編集:以下の回答の1つは再帰を示唆しています。リストが長くなった場合に Swift のスタック (これは iOS アプリ内にあります) への影響についてはわかりませんが、それは妥当に思えます。promise にチェーンすることによって、これをより自然に行うための構造があれば理想的です。