无法弄清楚如何防止 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 类型更改为DateDate?,因为它可以为零。或者你必须找出为什么它在 init 中为零?

以上是关于无法弄清楚如何防止 Date 类型崩溃并在 Swift 3 中包装的主要内容,如果未能解决你的问题,请参考以下文章

Apple 报告应用程序崩溃,但我无法弄清楚

我无法弄清楚这个崩溃:[__NSArrayM insertObject:atIndex:]: object cannot be nil

使用 mypy 进行类型检查,我无法弄清楚为啥会发生此错误 [关闭]

如何通过 SwiftUI 按钮在 UIViewController 中执行功能?

无法弄清楚这种重复的复杂性

C ++返回向量,无法弄清楚出了啥问题