【问题标题】:Different versions of Swift giving me errors不同版本的 Swift 给我错误
【发布时间】:2020-07-22 16:07:38
【问题描述】:

所以我一直在观看很多 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")
                }
            }
        }
    }
}

【问题讨论】:

  • FWIW,我假设您不是要在文件扩展名 ",m4a" 中包含那个逗号。

标签: swift xcode version mp3 avaudioplayer


【解决方案1】:

您只是因为在返回后没有 } 而搞砸了,所以 do and try 不再匹配。我在 swift 中注意到的一件事是,当我突然出现一大堆错误时,几乎总是错过了 } 位置。它使编译器真正混淆之后的所有东西。

        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")
        }

【讨论】:

    【解决方案2】:

    第一个问题是你的一个牙套放错了位置。

    应该是这样的:

    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
            }
        }
    }
    

    如果您选择您的代码 (command+a) 并按 control+i 或选择“Editor ” » “结构” » “重新缩进”,它会格式化你的代码,让你更容易看到错位的大括号在哪里。

    无论如何,这解决了“从这里抛出的错误未处理”错误。

    第二个错误,“在 'guard' 条件下声明的变量在其主体中不可用”是此代码的结果:

    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)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-13
      • 2021-02-24
      • 2020-11-09
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 2019-01-14
      相关资源
      最近更新 更多