无法弄清楚如何防止 Date 类型崩溃并在 Swift 3 中包装
Posted
技术标签:
【中文标题】无法弄清楚如何防止 Date 类型崩溃并在 Swift 3 中包装【英文标题】:Unable to figure out how to prevent crash with Date type and wrapping in Swift 3 【发布时间】:2017-03-12 06:09:44 【问题描述】:我正在使用 MPMediaQuery,特别是 Podcast。在这种特殊情况下,我在使用 Optionals 和包装/展开时遇到了非常困难的情况。
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")
【问题讨论】:
您是否尝试过设置断点并遵循程序的流程?也许发生了什么事情会产生副作用。也可以尝试,而不是使用属性访问器,junk.value(forProperty: the date added key)
,看看它给了你什么。如果它是 null 或一些时髦的东西,你可能已经偶然发现了一个 swift bug。
我实际上没有看到添加日期的键。
希望你能解决这个问题,祝你好运!
【参考方案1】:
似乎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 发送有关此问题的错误报告。 (可能被归类为重复,但数量可能会影响。)
【讨论】:
谢谢,成功了。需要注意的一点是,“dateAdded”仅在 iOS 10 之后才可用,所以我必须像这样包装扩展子句和我的用法:extension MPMediaItem @available(iOS 10.0, *) func getAddedDate() -> Date? return self.perform(#selector(getter: MPMediaItem.dateAdded))?.takeUnretainedValue() as! NSDate? as Date?
【参考方案2】:
在最后一次讨论之后,dateAdded
具有不可为空的类型Date
,当它 = nil 时会发生崩溃。
所以我建议它输入应该Date?
并且你应该打开它。
if let dAdded = junk.dateAdded
或者在这种情况下检查它会nil
。
if junk.dateAdded != nil
【讨论】:
dateAdded 输入为var dateAdded: Date get
。编译器知道类型。此外,它不是可为空的类型,但只会发出警告。
当dateAdded = nil
就在let dAdded: Date = junk.dateAdded
时它是否崩溃了?
不管我使用什么方法,它都会在“let”或“if”行崩溃。我更改为 if junk.dateAdded != nil 并且编译器声明“将 'Date' 类型的非可选值与 nil 进行比较总是返回 true”
另外,如果我使用if let dAdded = junk.dateAdded
,编译器会抱怨:“条件绑定的初始化程序必须具有可选类型,而不是'日期'”
是的。因为它的类型是不可为空的Date
。您应该将dateAdded
类型更改为Date
为Date?
,因为它可以为零。或者你必须找出为什么它在 init 中为零?以上是关于无法弄清楚如何防止 Date 类型崩溃并在 Swift 3 中包装的主要内容,如果未能解决你的问题,请参考以下文章
我无法弄清楚这个崩溃:[__NSArrayM insertObject:atIndex:]: object cannot be nil
使用 mypy 进行类型检查,我无法弄清楚为啥会发生此错误 [关闭]