我想从视频中读取元数据。控制台向我显示文件元数据的创建日期。我可能错误地提取了日期(通过字符串)。为什么我会收到致命错误?非常感谢!
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)!
}
我希望该函数从元数据返回创建日期。
我将
!
强制展开运算符称为“如果为零则崩溃”运算符。这就是它的作用。任何时候你使用它并且你强制解包的选项包含 nil,你的应用程序都会崩溃。你应该完全避免它,直到你真正真正理解选项,然后可能仍然避免它。
正如亚历山大在他的评论中所说,您输入的日期字符串似乎与您为 DateFormatter 提供的格式不匹配。依赖于外部数据格式的代码特别脆弱,您真的应该避免强制解包依赖于输入数据格式的代码。
研究
if let
、guard let
、??
“nil 合并运算符”以及其他安全处理 nil 选项的技术。即使您修复了日期格式化程序问题,我仍然建议摆脱强制展开并使用其他技术之一(或者甚至使您的日期字段成为一个可选值,如果您的代码无法正确解析日期,则为零,然后在其他地方进行防御性编码。)