为什么我不能使用Swift打开此可选值?

为什么我不能使用Swift打开此可选值?,swift,optional,forced-unwrapping,Swift,Optional,Forced Unwrapping,我正在尝试获取第一条记录的值,即2018-05-04 09:00:00+0000。当我打印“firstRecord”时,我在终端中得到一个可选值: 可选2018-05-04 09:00:00+0000 然后我试着像这样打开它: if dailyArray.count == 0 { print("no record was found") }else{ guard let firstRecord : String = dailyArray[0]["startTime"] as! S

我正在尝试获取第一条记录的值,即2018-05-04 09:00:00+0000。当我打印“firstRecord”时,我在终端中得到一个可选值:

可选2018-05-04 09:00:00+0000

然后我试着像这样打开它:

if dailyArray.count == 0 {
    print("no record was found")
}else{
    guard let firstRecord : String = dailyArray[0]["startTime"] as! String else {return}
    let firstRecordArray = firstRecord.components(separatedBy: " ")
    print("data exist \(firstRecordArray[0])")
}
现在Xcode给了我一个错误,告诉我您正在尝试打开一个非可选值

知道我在哪里犯了错误吗

你喜欢这样吗

guard !dailyArray.isEmpty, let firstRecord = dailyArray[0]["startTime"] as? String else { return }
let firstRecordArray = firstRecord.components(separatedBy: " ")
print("data exist \(firstRecordArray[0])")
在你的代码中,你是在强制打字,这是为什么

["startTime"] as! String 

这意味着值严格为字符串,而?表示它可以是字符串

您可以使用可选的链接和if-let语法来展开变量,使代码更加简洁明了:

// dailyArray should be declared as or typecast to [[String : String]]

guard !dailyArray.isEmpty else {
    print("no record was found")
    exit(1) // or return if in func
}

if let firstRecord = dailyArray.first?["startTime"]?.components(separatedBy: " ") {
    print("data exists: \(firstRecord.first)")
}
else {
    print("no start time date was found")
}

如果要使用可选链接,那么也可以使用。首先,在空数组中返回可选的nil,而不是[0]返回值,在空数组中崩溃:

guard !dailyArray.isEmpty else {
    print("no record was found")
    return
}
guard let firstRecord = dailyArray.first?["startTime"] as? String else {
    return
}
let firstRecordArray = firstRecord.components(separatedBy: " ")
print("data exist \(firstRecordArray[0])")

我也试过这个。它会删除错误,但不会产生任何输出:|您确定dailyArray[0][startTime]不是nil,并且它实际上是字符串类型而不是日期吗?如果需要调试,则应将guard语句分解为一系列guard语句,以确定哪个语句失败。能够链接guard语句很好,但这会使调试更加困难。我已经根据问题给出了解决方案,他需要并期望字符串在那里,否则他可以使用不同的类型,而不是系列guard,只是调试中的简单断点工作,为什么有人想要他的代码可以是一对多line@DanialKosarifar:只需在guard语句之前打印数组的值/或使用断点检查值是否为字符串,同时您将看到数组是否为空,dailyArray的类型是什么?确切的错误消息是什么?-是否字符串是可选的。。。存储在字典中,即创建字典时问题已经出现?可选。。用小写字母o?你是如何创建字典/数组的?你能打印firstRecord.utf16.count吗?A!不强制展开,因此它不是可选的。用作?。该输出表明您实际上有一个日期值,而不是字符串值。@rmaddy它可能是一个日期或字符串,但如果它是一个日期对象,则它将因强制转换而崩溃。因此,正如所暗示的,它的创建可能是错误的,而展开应该在那里完成。即使小写字母o看起来很奇怪。与其dailyArray.count>0,通常最好这样做:!我是空的。另外,不要直接订阅[0],而是使用DailArray.first?[startTime]?.co.,因为您仍然可以选择进行更改。根据注释进行更新。@LeoDabus它不会造成伤害,并且可以防止前面代码部分中的重构。