!
означает оператор сбоя, разворачивает необязательное значение. Значение там работает как, например, 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)
}
Теперь, если путь не является обязательным, не может достичь блока и перейти к следующей строке