質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

1684閲覧

swiftでviewDidLoadに書かれた処理が順次に処理されない

ijuya_yika

総合スコア50

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/06/12 11:56

英単語を推測するゲームを作っています。

viewDidLoadでまずvocab.txtを読み込み、newRound()で単語をテスト、その後missedVocab.txtに保存するようにしたいのですが、newRound()が実行される前にmissedVocab.txtへ保存するコードが実行されてしまっています。

newRound()が完全に終わってからテキストファイルへ保存するようにしたいのですがどのように実装すれば良いでしょうか?

swift

1override func viewDidLoad() { 2 super.viewDidLoad() 3 // --- テキストファイルの取得 --- 4 if let filePath = Bundle.main.path(forResource: "vocab", ofType: "txt"), 5 let str = try? String(contentsOfFile: filePath, encoding: String.Encoding.utf8) { 6 7 var vocabArr = str.components(separatedBy: "\n") 8 9 for i in 0..<vocabArr.count { 10 let j = Int(arc4random_uniform(UInt32(vocabArr.count))) 11 if i != j { 12 vocabArr.swapAt(i,j) 13 } 14 } 15 16 for vocab in vocabArr { 17 var appendObj = vocab.components(separatedBy: "#") 18 appendObj[0] = appendObj[0].trimmingCharacters(in: .whitespaces) 19 if appendObj != [""] { 20 vocabList.append(appendObj) 21 } 22 } 23 24 // 新しいゲームを開始 25 // 問題を間違える度にmissedVocabs[]にstringを保存 26 newRound() 27 28 29 // missedVocabsに保存されたstringをファイルに保存 30 if let dir = FileManager.default.urls( for: .documentDirectory, in: .userDomainMask ).first { 31 32 let filePath = dir.appendingPathComponent( "missedVocab.txt" ) 33 print("abh") 34 print(filePath) 35 36 do { 37 print("filepath : (filePath)") 38 print("missedVocabs : (missedVocabs)") 39 for missedVocab in missedVocabs { 40 try missedVocab.write(to: filePath, atomically: true, encoding: .utf8) 41 } 42 } catch { } 43 } 44 } 45}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/12 12:29 編集

for-in文でmissedVocab上書きしてませんか?
ijuya_yika

2018/06/12 16:24 編集

このままだと上書きされてしまうのでそれも要修正です。今問題視してるのが、newRound()の中で単語を間違える度に間違えた単語をprintしているのですが、それよりnewRound()の後に書かれてるprint("missedVocabs : \(missedVocabs)")が実行されることでして、確実にnewRound()が終わったあとにdo{} catch{} のコードを実行するにはどうすればよいでしょうか?
退会済みユーザー

退会済みユーザー

2018/06/12 16:59

戻り値じゃだめかな? DispatchQueueか、クロージャか。
fuzzball

2018/06/13 02:54

「newRound()が実行される前にmissedVocab.txtへ保存するコードが実行されてしまっています」というのはありえません。newRound()から戻ってこない限り、その下にある保存処理は実行されません。また、ViewControllerのライフサイクルを理解できていないようなので、その辺りから調べることをおすすめします。
MasakiHori

2018/06/13 09:43

newRound()内の保存部分が非同期なのでは?
guest

回答1

0

newRound()が何をしているのか分からないのですが、ファイルに保存する処理をメソッドとして切り出し、newRound()メソッドの中の条件によって呼び出せばよいのではないでしょうか?

swift

1 2import UIKit 3 4class ViewController: UIViewController { 5 6 var vocabList: [[String]] = [] 7 var missedVocabs: [String] = [] 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 // --- テキストファイルの取得 --- 12 if let filePath = Bundle.main.path(forResource: "vocab", ofType: "txt"), 13 let str = try? String(contentsOfFile: filePath, encoding: String.Encoding.utf8) { 14 15 var vocabArr = str.components(separatedBy: "\n") 16 17 for i in 0..<vocabArr.count { 18 let j = Int(arc4random_uniform(UInt32(vocabArr.count))) 19 if i != j { 20 vocabArr.swapAt(i,j) 21 } 22 } 23 24 for vocab in vocabArr { 25 var appendObj = vocab.components(separatedBy: "#") 26 appendObj[0] = appendObj[0].trimmingCharacters(in: .whitespaces) 27 if appendObj != [""] { 28 vocabList.append(appendObj) 29 } 30 } 31 32 // 新しいゲームを開始 33 // 問題を間違える度にmissedVocabs[]にstringを保存 34 newRound() 35 36 } 37 } 38 39 func newRound() { 40 // ゲーム処理... 41 42 // 問題を間違えた場合の処理 43 if 判定 { 44 fileSave() 45 } 46 } 47 48 func fileSave() { 49 // missedVocabsに保存されたstringをファイルに保存 50 if let dir = FileManager.default.urls( for: .documentDirectory, in: .userDomainMask ).first { 51 52 let filePath = dir.appendingPathComponent( "missedVocab.txt" ) 53 print("abh") 54 print(filePath) 55 56 do { 57 print("filepath : (filePath)") 58 print("missedVocabs : (missedVocabs)") 59 for missedVocab in missedVocabs { 60 try missedVocab.write(to: filePath, atomically: true, encoding: .utf8) 61 } 62 } catch { } 63 } 64 } 65}

投稿2018/06/12 19:25

_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問