Первая проблема заключается в том, что одна из ваших скобок находится в неправильном месте.
Это должно быть примерно так:
class ViewController: UIViewController {
@IBOutlet var button: UIButton!
var player: AVAudioPlayer?
@IBAction func didTapButton() {
if let player = player, player.isPlaying {
// stop playback
player.stop()
} else {
// set up player and play
let urlString = Bundle.main.path(forResource: "30 Minute Hockey Mix", ofType: "m4a")
do {
try AVAudioSession.sharedInstance().setMode(.default)
try AVAudioSession.sharedInstance().setActive(true, options: .notifyOthersOnDeactivation)
guard let urlString = urlString else {
return
}
player = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: urlString))
guard let player = player else {
return player.play()
}
} // add this
catch {
print("Error", error)
}
// } remove this
}
}
}
Если вы выберете свой код ( команда *) 1007 * + a ) и нажмите control + i или выберите «Редактор» »« Структура »» «Повторный отступ», он отформатирует ваш код, облегчая просмотр местоположения неуместных фигурных скобок.
В любом случае, это устраняет ошибку «Ошибки, сгенерированные отсюда, не обрабатываются».
Вторая ошибка, «переменная, объявленная в», защищена «условие не может быть использовано в его теле» является результатом этого кода:
guard let player = player else {
return player.play()
}
Это не имеет смысла. Это говорит: «Если я не могу развернуть player
, тогда return
это». Возможно, вы имели в виду:
if let player = player {
player.play()
}
Или, проще говоря, вы можете использовать опциональную цепочку, которая позволяет добиться того же результата более кратко:
player?.play()
Таким образом:
class ViewController: UIViewController {
@IBOutlet var button: UIButton!
var player: AVAudioPlayer?
@IBAction func didTapButton() {
if let player = player, player.isPlaying {
// stop playback
player.stop()
}
else{
// set up player and play
let urlString = Bundle.main.path(forResource: "30 Minute Hockey Mix", ofType: "m4a")
do {
try AVAudioSession.sharedInstance().setMode(.default)
try AVAudioSession.sharedInstance().setActive(true, options: .notifyOthersOnDeactivation)
guard let urlString = urlString else {
return
}
player = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: urlString))
player?.play()
} catch {
print("Error", error)
}
}
}
}
Я мог бы еще упростить это:
class ViewController: UIViewController {
@IBOutlet var button: UIButton!
var player: AVAudioPlayer?
@IBAction func didTapButton() {
if let player = player, player.isPlaying {
// stop playback
player.stop()
return
}
// set up player and play
guard let url = Bundle.main.url(forResource: "30 Minute Hockey Mix", withExtension: "m4a") else {
return
}
do {
try AVAudioSession.sharedInstance().setMode(.default)
try AVAudioSession.sharedInstance().setActive(true, options: .notifyOthersOnDeactivation)
player = try AVAudioPlayer(contentsOf: url)
player?.play()
} catch {
print("Error", error)
}
}
}