2017-03-12 49 views
0

我正在使用MPMediaQuery,特别是Podcasts。在这种特殊情况下,我在选择和包装/解包方面遇到了很多困难。无法弄清楚如何防止日期类型崩溃,并在Swift 3中打包

titleFilter = MPMediaPropertyPredicate(value: selectedPodcastTitle, forProperty: MPMediaItemPropertyPodcastTitle, comparisonType: .equalTo) 
    qryPodcasts.addFilterPredicate(titleFilter) 

    for junk in qryPodcasts.items!{ 

     //works fine 
     if let sTitle = junk.title { 
      print("episode title: \(sTitle)") 
     }else{ 
      print("episode title is nil") 
     } 

     //works fine 
     if let dRelease = junk.releaseDate { 
      print("episode release date: \(dRelease)") 
     }else{ 
      print("episode release date is nil") 
     } 
     if #available(iOS 10.0, *) { 
      // can't figure out how to make this work 
      // crashes on some podcasts and I suspect it's when 'addedDate' is nil 
      if let dAdded: Date = junk.dateAdded { 
       print("episode added date: \(junk.dateAdded)") 
      }else{ 
       print("episode added date is nil") 
      } 
     } else { 
      print("episode added date is not available") 
     } 
    } 
+0

您是否尝试过设置断点并遵循程序流程?也许会有一些副作用。 也可以尝试使用'junk.value(forProperty:日期添加键)'属性存取器,而不是使用属性存储器,并查看给出的内容。如果它是空的或有些怪异的,你可能会偶然发现一个快捷的错误。 – hola

+0

实际上我没有看到日期添加键。 – hola

+0

希望你明白这一点,祝你好运! – hola

回答

0

似乎的dateAdded为空性在当前的iOS SDK被错误注释,你可能需要一些解决方法。

试试这个扩展:

extension MPMediaItem { 
    func getAddedDate() -> Date? { 
     return self.perform(#selector(getter: MPMediaItem.dateAdded))?.takeUnretainedValue() as! NSDate? as Date? 
    } 
} 

而且使用它像:

 if let dAdded = junk.getAddedDate() { 
      print("episode added date: \(dAdded)") 
     }else{ 
      print("episode added date is nil") 
     } 

你最好发送错误报告Apple这个问题。 (它可能被分类为重复,但数字可能会影响)。

+0

谢谢,这工作。需要注意的一点是,“dateAdded”仅在iOS 10以后才可用,因此我必须包装扩展子句和我的用法,如下所示:'extension MPMediaItem {iOS 10.0,*) func getAddedDate() - >日期? {self_perform(#selector(getter:MPMediaItem.dateAdded))?. takeUnretainedValue()as! NSDate的?作为日期? } }' – wayneh

0

最后讨论后,dateAdded具有非可空类型Date和碰撞发生时,它=零。

所以我建议它的类型应该Date?,你应该解开它。

if let dAdded = junk.dateAdded { 
} 

或在这种情况下检查它会nil

if junk.dateAdded != nil { 
} 
+0

dateAdded被键入为'var dateAdded:Date {get}'。编译器知道类型。此外,它不是可以空的类型,但只是给出警告。 – hola

+0

当'dateAdded = nil'在'let dAdded:Date = junk.dateAdded'时发生崩溃了吗? –

+0

无论我使用什么方法,它都会在“let”或“if”行崩溃。我改成如果junk.dateAdded!= nil,编译器指出“比较类型'Date'的非可选值到nil总是返回true' – wayneh