无法弄清楚如何防止日期类型崩溃,并在Swift 3中打包
问题描述:
我正在使用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")
}
}
答
似乎的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
答
最后讨论后,dateAdded
具有非可空类型Date
和碰撞发生时,它=零。
所以我建议它的类型应该Date?
,你应该解开它。
if let dAdded = junk.dateAdded {
}
或在这种情况下检查它会nil
。
if junk.dateAdded != nil {
}
您是否尝试过设置断点并遵循程序流程?也许会有一些副作用。 也可以尝试使用'junk.value(forProperty:日期添加键)'属性存取器,而不是使用属性存储器,并查看给出的内容。如果它是空的或有些怪异的,你可能会偶然发现一个快捷的错误。 – hola
实际上我没有看到日期添加键。 – hola
希望你明白这一点,祝你好运! – hola