Swift的不同版本给我错误

问题描述 投票:0回答:2

所以我一直看很多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")
                }
            }
        }
    }
}
swift xcode version mp3 avaudioplayer
2个回答
0
投票

返回后,您就没有了}便陷入混乱,因此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")
        }

0
投票

第一个问题是您的一个大括号放置在错误的位置。

应该是这样:

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)
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.