Как исправить 'appendingPathComponent' недоступно: используйте appendingPathComponent при ошибке URL - PullRequest
0 голосов
/ 13 апреля 2019

Я работаю над старым учебным пособием по Swift (Swift 2.0), которое размещено на веб-сайте Рэя Вендерлиха (https://www.raywenderlich.com/2185-how-to-make-a-letter-word-game-with-uikit-and-swift-part-3-3)), и у меня возникает ошибка, когда я пытался переустановить функцию под названием «preloadAudioEffects»"в Swift 4.2. Ошибка? appendingPathComponent 'недоступна: вместо этого используйте appendingPathComponent для URL.

Я пытался переименовать старый код Swift [Ex: NSBundle в Bundle, stringByAppendingPathComponent в appendingPathComponent ()], ноЯ все еще сталкиваюсь с некоторыми проблемами синтаксиса из-за моей неопытности в Swift.

Это оригинальный код:

func preloadAudioEffects(effectFileNames:[String]) {
  for effect in AudioEffectFiles {
    //1 get the file path URL
    let soundPath = NSBundle.mainBundle().resourcePath!.stringByAppendingPathComponent(effect)
    let soundURL = NSURL.fileURLWithPath(soundPath)

    //2 load the file contents
    var loadError:NSError?
    let player = AVAudioPlayer(contentsOfURL: soundURL, error: &loadError)
    assert(loadError == nil, "Load sound failed")

    //3 prepare the play
    player.numberOfLoops = 0
    player.prepareToPlay()

    //4 add to the audio dictionary
    audio[effect] = player
  }
}

И это то, что я пытался сделать, следуя инструкциямпредложения в Xcode:

func preloadAudioEffects(effectFileNames:[String]) {
        for effect in AudioEffectFiles {
            //1 get the file path URL
            let soundPath = Bundle.main.resourcePath!.appendingPathComponent(effect)
            let soundURL = NSURL.fileURL(withPath: soundPath)

            //2 load the file contents
            var loadError:NSError?
            let player = AVAudioPlayer(contentsOfURL: soundURL, error: &loadError)
            assert(loadError == nil, "Load sound failed")

            //3 prepare the play
            player.numberOfLoops = 0
            player.prepareToPlay()

            //4 add to the audio dictionary
            audio[effect] = player
        }
    }
  1. Получить полный путь к звуковому файлу и преобразовать его в URL, используя NSURL.fileURLWithPath ().
  2. Вызов AVAudioPlayer (contentsOfURL: error:) для загрузки звукового файла в аудиопроигрыватель.
  3. Установите значение numberOfLoops на ноль, чтобы звук вообще не зацикливался. Вызовите prepareToPlay () для предварительной загрузки Audio-буфер для этого звука.
  4. Наконец, сохраните объект проигрывателя в аудио словаре, используя имя файла в качестве ключа словаря.

1 Ответ

0 голосов
/ 13 апреля 2019

Просто замените resourcePath на resourceURL

let soundURL = Bundle.main.resourceURL!.appendingPathComponent(effect)

и вам нужно обернуть инициализатор AVAudioPlayer в try блок

func preloadAudioEffects(effectFileNames:[String]) {
    for effect in AudioEffectFiles {
        let soundURL = Bundle.main.resourceURL!.appendingPathComponent(effect)

        //2 load the file contents

        do {
           let player = try AVAudioPlayer(contentsOf: soundURL)
           //3 prepare the play
           player.numberOfLoops = 0
           player.prepareToPlay()

           //4 add to the audio dictionary
           audio[effect] = player

        } catch { print(error) }
    }
}
...