アプリ名:超簡単英語App
内容:とっても簡単な英語の音声付きクイズ
#xcode #swift pic.twitter.com/ZhqmLJuRm9
— aa2302 (@aa23021) May 9, 2020
サンプルコード
import UIKit
import AVFoundation
class ViewController: UIViewController {
@IBOutlet weak var label00: UILabel!
@IBOutlet weak var label01: UILabel!
@IBOutlet var button01: [UIButton]!
@IBOutlet weak var currectAnswer: UIImageView!
@IBOutlet weak var incorrectAnswer: UIImageView!
var talker = AVSpeechSynthesizer()
@IBAction func onnsei(_ sender: Any) {
guard let text = label01.text else{
return
}
let utterance = AVSpeechUtterance(string: text)
utterance.rate = 0.4
utterance.voice = AVSpeechSynthesisVoice(language: "en-US")
self.talker.speak(utterance)
}
var csvArray : [[String]] = []
var questionNumber = 0
var correctAnswerNumber = 0
override func viewDidLoad() {
super.viewDidLoad()
csvToArray()
question()
}
func csvToArray() {
if let csvPath = Bundle.main.path(forResource: "quiz", ofType: "csv") {
do {
let csvStr = try String(contentsOfFile: csvPath, encoding: String.Encoding.utf8)
let csvArr = csvStr.split(separator: "\n").map(String.init)
for csvFile in csvArr {
let csvsplit = csvFile .components(separatedBy: ",")
csvArray.append(csvsplit)
}
print(csvArray)
}catch let error as NSError {
print(error.localizedDescription) }}}
func question() {
if questionNumber >= csvArray.count {
let alert = UIAlertController(title: "漫画クイズ", message: "5問中\(correctAnswerNumber)問正解", preferredStyle: .alert)
let action = UIAlertAction(title: "終了", style: .default, handler: {
(_) in self.dismiss(animated: true, completion: nil)
})
alert.addAction(action)
present(alert, animated: true, completion: nil)
return
}
func numberList() -> [Int] {
var list = [1,2,3,4]
for _ in 1...10 {
let i1 = Int(arc4random() % 4)
let i2 = Int(arc4random() % 4)
if i1 != i2 {
list.swapAt(i1,i2)
} }
return list }
let problemData = csvArray[questionNumber]
label00.text = "第" + "\(questionNumber+1)問"
label01.text = (problemData[0]as AnyObject as! String)
let number = numberList()
for i in 0...3 {
button01[i].setTitle(problemData[number[i]], for: .normal)
}
}
@IBAction func buttonCheck(_ sender: Any) {
let answer = (sender as AnyObject).currentTitle!
let questionData = csvArray[questionNumber]
let answerNumber = questionData.index(of: answer!)
if answerNumber == 1 {
correctAnswerNumber += 1
UIView.animate(withDuration: 1.5, animations: {
UIApplication.shared.beginIgnoringInteractionEvents()
self.currectAnswer.alpha = 1.0
}) { (Bool) in
self.currectAnswer.alpha = 0.0
self.questionNumber += 1
self.question()
UIApplication.shared.endIgnoringInteractionEvents()
}
} else {
UIView.animate(withDuration: 1.5, animations: {
UIApplication.shared.beginIgnoringInteractionEvents()
self.incorrectAnswer.alpha = 1.0
}) { (Bool) in
self.incorrectAnswer.alpha = 0.0
self.questionNumber += 1
self.question()
UIApplication.shared.endIgnoringInteractionEvents()
} } }}
困ったところ
前回のクイズAppで使ったコードに音声読みあ読み上げ機能を入れようとimport AVFoundationを入力したところ
button01[i].setTitle((problemData[number[i]]as AnyObject as! String), for: .normal)
のコードにAmbiguous use of 'subscript(_:)'
というエラーが。
色々探して型がよくないことはわかったものの、何変えればいいのか、どのように変えればいいのかが全くわからず5時間探しても全然わからなかったのでプログラミングについて質問出来るサイトに質問させて頂いたらすぐに答えが返ってきました。
解決策
csvのAnyObjectを[[String]]に変えるだけでした。
メモ
・CSV の各行を , で分割した配列が [String]
それが複数行あるのが[[String]]は文字列の配列の配列
・AnyObjectは、①あらゆるクラス型のインスタンスを表現できる。
②構造体としては振る舞えない。
③あらゆるクラス、またはClass only protocolの具象型として利用出来る。
AnyObjectついて気になり調べたものの未だにあんまりピンとはきていません💦
雑談
プログラミングを勉強し始めて思うことは、ネットで質問をしたら答えて下さる方がとても多く驚きとともに本当に感謝しています。🙇♀️