为什么致命错误:在解包可选值时意外发现 NIL

问题描述 投票:0回答:1

我想从视频中读取元数据。控制台向我显示文件元数据的创建日期。我可能错误地提取了日期(通过字符串)。为什么我会收到致命错误?非常感谢!

    func getVideoMetadataDate (srcPath: String, itemSrc: String) async -> Date {
        
        let dF = DateFormatter()
        dF.dateFormat = "yyyy:MM:dd HH:mm:ss"
        
        let returnValue: String = "1975:01:01 00:00:00"
        
        
        let itemSrcURL = URL(fileURLWithPath: srcPath + "/" + String(itemSrc))
        let asset = AVAsset(url: itemSrcURL)
        
        do {
            for format in try await asset.load(.availableMetadataFormats) {
                
                let metadata = try await asset.loadMetadata(for: format)

                let dateItems = AVMetadataItem.metadataItems(from: metadata, filteredByIdentifier: .commonIdentifierCreationDate)
                guard let item = dateItems.first else { return dF.date(from: returnValue)! }
                let dateCreate = item.value as! String
                print(dateCreate) // Console -> = "2024-02-13T13:22:30+0100"
                return dF.date(from: dateCreate)! // Here -> Thread 9: Fatal error: Unexpectedly found nil while unwrapping an Optional value
            }
        } catch {
            return dF.date(from: returnValue)!
        }
        return dF.date(from: returnValue)!
    }

我希望该函数从元数据返回创建日期。

swift function date null unwrapping
1个回答
0
投票

我将

!
强制展开运算符称为“如果为零则崩溃”运算符。这就是它的作用。任何时候你使用它并且你强制解包的选项包含 nil,你的应用程序都会崩溃。你应该完全避免它,直到你真正真正理解选项,然后可能仍然避免它。

正如亚历山大在他的评论中所说,您输入的日期字符串似乎与您为 DateFormatter 提供的格式不匹配。依赖于外部数据格式的代码特别脆弱,您真的应该避免强制解包依赖于输入数据格式的代码。

研究

if let
guard let
??
“nil 合并运算符”以及其他安全处理 nil 选项的技术。即使您修复了日期格式化程序问题,我仍然建议摆脱强制展开并使用其他技术之一(或者甚至使您的日期字段成为一个可选值,如果您的代码无法正确解析日期,则为零,然后在其他地方进行防御性编码。)

© www.soinside.com 2019 - 2024. All rights reserved.