xcode9 swift4 Фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь воспроизвести mp3-файл (5 секунд) при запуске приложения, и у меня появляется ошибка:

Поток 1: неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения

import UIKit
import AudioToolbox

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    //create SystemSoundID
    var soundID:SystemSoundID = 0
    let path = Bundle.main.path(forResource: "iPhone100Voice", ofType: "mp3")
    let baseURL = NSURL(fileURLWithPath: path!)
    AudioServicesCreateSystemSoundID(baseURL, &soundID)
    //play
    AudioServicesPlaySystemSound(soundID)

    }

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }

}

Может кто-нибудь объяснить, почему и как я могу это исправить?

Ответы [ 4 ]

0 голосов
/ 05 мая 2018

Проверьте эти точки, все условия должны быть выполнены:

  • Файл находится в навигаторе проекта?
  • Установлен ли флажок Target Membership в Инспекторе файлов (чтобы получить его, выберите файл и нажмите ⌥⌘1 )
  • Правильно ли написано имя файла (iPhone100Voice.mp3)?
0 голосов
/ 05 мая 2018

Может помочь вам в воспроизведении видео. При добавлении видео файла в проект убедитесь, что флажок цели установлен или не установлен в Инспекторе файлов.

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)


        if  let path = Bundle.main.path(forResource: "video_1523966087401 (1)", ofType: ".mp4"){
            let player = AVPlayer(url: URL(fileURLWithPath: path))
            let playerController = AVPlayerViewController()
            playerController.player = player
            present(playerController, animated: true) {
                player.play()
            }
        }else{
            //show dialog to user

            print("Error: File not found")
        }
    }
0 голосов
/ 05 мая 2018

! означает оператор сбоя, разворачивает необязательное значение. Значение там работает как, например, Optional (53), скажем. Таким образом, переменная должна содержать значение, кроме nil, когда path! пытается развернуть необязательно и добавляет значение 53 в переменную пути.

чтобы исправить это, мы можем использовать два способа

Используя охрану,

guard let pathValue = path else {
        return
}

let baseURL = NSURL(fileURLWithPath: pathValue) //no need to use pathValue, if you use then you have to use path!, although it makes no crash now.  
AudioServicesCreateSystemSoundID(baseURL, &soundID)
//play
AudioServicesPlaySystemSound(soundID)

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

используя if-let, зная optional binding

if let pathValue = path {
    let baseURL = NSURL(fileURLWithPath: pathValue) //same comment
    AudioServicesCreateSystemSoundID(baseURL, &soundID)
    //play
    AudioServicesPlaySystemSound(soundID)
} 

Теперь, если путь не является обязательным, не может достичь блока и перейти к следующей строке

0 голосов
/ 05 мая 2018

Пожалуйста, проверьте имя вашего файла, возможно, имя файла неверное или его нет в комплекте

Поэтому, пожалуйста, проверьте имя файла с расширением.

Используйте if let или guard до unwrap путь:

override func viewDidLoad() {

    super.viewDidLoad()
    var soundID:SystemSoundID = 0

    if let path = Bundle.main.path(forResource: "iPhone100Voice", ofType: "mp3") {
       let baseURL = NSURL(fileURLWithPath: path)
       AudioServicesCreateSystemSoundID(baseURL, &soundID)
       AudioServicesPlaySystemSound(soundID)
    } else {
        let alert = UIAlertController(title: "Alert", message: "File not found in your bundle", preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil))
        self.present(alert, animated: true, completion: nil)

   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...