Различные версии Swift дают мне ошибки - PullRequest
0 голосов
/ 10 апреля 2020

Итак, я смотрел много видео на YouTube, и в настоящее время кажется, что существует огромная разница между одной версией Swift и другой. Я буквально посмотрел на это строка за строкой ... символ за символом, и точный дубликат дает мне ошибки типа

Ошибки, выброшенные отсюда, не обрабатываются

и

Переменная Объявленная в состоянии 'guard', не может использоваться в своем теле.

Я пытался заставить кнопку проигрывать 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")
                }
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Первая проблема заключается в том, что одна из ваших скобок находится в неправильном месте.

Это должно быть примерно так:

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)
        }
    }
}
1 голос
/ 10 апреля 2020

Вы только что запутались, не имея} после вашего возвращения, поэтому попытки и попытки больше не совпали. Одна вещь, которую я заметил в 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")
        }
...