我正在从musicPlayer获取当前播放的歌曲,当艺术家为零时,应用程序崩溃。我如何安全地解开这个,所以如果没有艺术家,那么应用程序不会崩溃,而只是在控制台中不打印任何艺术家?
func getNowPlayingItem() {
if let nowPlaying = musicPlayer.nowPlayingItem {
let title = nowPlaying[MPMediaItemPropertyTitle] as? String
//I want to safely unwrap the artist
let artist = nowPlaying[MPMediaItemPropertyArtist] as? String
print("Song: " + title!)
print("Artist: " + artist!)
print("\n")
arrayOfSongs.append(title!)
}
答案 0 :(得分:2)
将感叹号视为警告 - 除非您完全确定该物品可以打开,否则不要使用它!
因此,只需将let title
和let artist
更改为if let
块,您可以安全地使用展开的值:
func getNowPlayingItem() {
if let nowPlaying = musicPlayer.nowPlayingItem {
if let title = nowPlaying[MPMediaItemPropertyTitle] as? String {
print("Song: " + title)
arrayOfSongs.append(title)
}
if let artist = nowPlaying[MPMediaItemPropertyArtist] as? String {
print("Artist: " + artist)
}
print("\n")
}
答案 1 :(得分:1)
你可以这样做
print("Artist: " + (artist ?? "no artist"))
答案 2 :(得分:1)
现在artist
是一个可选字符串(String?
)。这意味着它可以包含String或值nil
。要访问String内部(如果存在),您需要打开可选项。打开可选项有两种方法:
!
当您执行artist!
时,这就是您在代码示例中所做的事情。可选项被强制解包为String。但是,如果artist
实际上等于nil
,则强制解包会使您的应用崩溃。因此,为了安全地执行此操作,您需要先检查artist == nil
。
if (artist == nil) {
print("it's nil!")
} else {
print("Artist: " + artist!)
}
if let
这是推荐且不易出错的选项。这允许我们在不使用!
的情况下展开选项。 !
向您发出信号,这是一段不安全的代码,如果可选项为nil,可能会崩溃,您应该尽量避免使用它。这是可选绑定的样子:
if let artist = nowPlaying[MPMediaItemPropertyArtist] as? String {
// This code only runs if the optional was NOT nil
// The artist variable is the unwrapped String
print("Artist: " + artist)
} else {
// This code only runs if the optional nil
print("it's nil!")
}