所以我一直看很多YouTube视频,目前看来就像一个版本的Swift和另一个版本之间存在巨大的脱节。我从字面上看了一行一行...一个字符一个字符地完全重复会给我类似
的错误从这里抛出的错误未得到处理
和
声明为“后卫”状态的变量在其主体中不可用。
我试图让按钮播放MP3 ...找到了一个不错的教程,但是我写完了代码,这给了我很多错误...
import AVFoundation
import UIKit
class ViewController: UIViewController {
@IBOutlet var button: UIButton!
var player: AVAudioPlayer?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@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()
}
catch do {
print("Error You dumbass")
}
}
}
}
}
返回后,您就没有了}便陷入混乱,因此do and try不再匹配。我迅速注意到的一件事是,当我突然出现一堆错误时,几乎总是错过}的位置。它会使所有事情都真正使编译器感到困惑。
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()
} catch {
print("Error You dumbass")
}
第一个问题是您的一个大括号放置在错误的位置。
应该是这样:
class ViewController: UIViewController {
@IBOutlet var button: UIButton!
var player: AVAudioPlayer?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@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
}
}
}
如果选择代码,然后按control + i,它将格式化您的代码,使查看括号位置的位置更加容易。
无论如何,解决了“不处理从这里抛出的错误”错误。
第二个错误,“声明为'守卫'状态的变量在其主体中不可用”是此代码的结果:
guard let player = player else {
return player.play()
}
这没有道理。就是说“如果我不能解开player
,那么就return
”。也许你的意思是:
if let player = player else {
player.play()
}
或更简单地说,您可以使用可选的链接,这样可以更简洁地实现相同的目的:
player?.play()
因此:
class ViewController: UIViewController {
@IBOutlet var button: UIButton!
var player: AVAudioPlayer?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@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)
}
}
}
}