制限時間を設けた簡単なクイズアプリを作っています。
questionメソッドで問題文を表示、時間切れでアラートを表示させるというものです。
以下のようなコードを書きました。
var timer = Timer() var seconds = 50 let workItem = DispatchWorkItem(block: { }) func question() { //Labelに問題を表示する記述 let random = Int(arc4random_uniform(UInt32(hairetsu.count))) //追記 ここから// hairetsuLabel.text = hairetsu[random] let random2 = Int(arc4random_uniform(UInt32(hairetsu2.count))) hairetsuLabel2.text = hairetsu2[random2] //ここまで (変数の名前は実際のコードと変えてます) timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.counter), userInfo: nil, repeats: true) DispatchQueue.main.asyncAfter(deadline: .now() + 5.0, execute: workItem) { //ここでエラーメッセージ self.timeOverAlert(a: random) } } @objc func counter() { seconds -= 1 remainingTimeLabel.text = "残り時間:" + String(seconds) + " 秒" if (seconds == 0) { timer.invalidate() } } func timeOverAlert(a:Int) { let correctAnswer = UIAlertController(title: "【正解】",message: "....(random)", preferredStyle: UIAlertController.Style.alert) let nextAction = UIAlertAction(title: "次へ", style: UIAlertAction.Style.default){ (action: UIAlertAction) in self.seconds = 50 self.remainingTimeLabel.text = "残り時間:" + String(self.seconds) + " 秒" self.question() } correctAnswer.addAction(nextAction) present(correctAnswer,animated: true,completion: nil) }
しかし以下のようなエラーメッセージが出ます。
Argument labels '(deadline:, execute:, _:)' do not match any available overloads
エラーメッセージから記述の仕方が間違っているということだと思うのですが、調べても分かりませんでした。
https://developer.apple.com/documentation/dispatch/dispatchqueue/2300020-asyncafter
どこが間違っているのでしょうか?
よろしくお願いします。
.
.
追記:
if seconds == 0 { timer.invalidate() }
この中にtimeOverAlert()
を記述すればいいと思うのですが、question()
で生成したランダムな数字(random)をうまく渡すことができませんでした。
わざわざDispatchWorkItemを用いる理由は「次へ」のボタンを配置していて、ボタンを押されたらquestion()
を実行します。するとタイマーのインターバルが1秒よりも加速してしまうため、これを解決するためにworkItem.cancel
を使いたいと思いました。
.
.
fuzzballさんへの返信:
コードが見づらいと思ったので質問の方にも書きます。
回答ありがとうございます。今回は上のコードを使いたいと思います。
ViewControllerクラス直下に
let workItem = DispatchWorkItem(block: { self.timeOverAlert(a: random) })
を書くと
エラーValue of type '(ViewController) -> () -> (ViewController)' has no member 'timeOverAlert'
が出て self. を取るとエラーInstance member 'timeOverAlert' cannot be used on type 'ViewController'; did you mean to use a value of this type instead?
が出てしまいます。
こちらはどのようにして解決できますでしょうか?
timeOverAlert(a: Int)
内に書けばエラーは出ないのですが、workItem.cancelを使いたいのがnextButtonAlert()
内なのでクラス直下に書くまたは他の方法がありましたら教えていただきたいです。
回答を頂いてから色々試してみましたがうまくいきませんでした。
何個も聞いてしまいすみません。
追記に書いた「「次へ」のボタンを配置していて、ボタンを押されたらquestion()
を実行します。」この部分がnextButtonAlert()
です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/18 08:56
2019/01/18 09:30 編集
2019/01/18 09:52