如何安全打开可选项?

时间:2015-11-26 05:01:54

标签: ios swift

我正在从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!)





}

3 个答案:

答案 0 :(得分:2)

将感叹号视为警告 - 除非您完全确定该物品可以打开,否则不要使用它!

因此,只需将let titlelet 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内部(如果存在),您需要打开可选项。打开可选项有两种方法:

  1. 强制解包:!
  2. 当您执行artist!时,这就是您在代码示例中所做的事情。可选项被强制解包为String。但是,如果artist实际上等于nil,则强制解包会使您的应用崩溃。因此,为了安全地执行此操作,您需要先检查artist == nil

    if (artist == nil) {
        print("it's nil!")
    } else {
        print("Artist: " + artist!)
    }
    
    1. 可选绑定:if let
    2. 这是推荐且不易出错的选项。这允许我们在不使用!的情况下展开选项。 !向您发出信号,这是一段不安全的代码,如果可选项为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!")
      }