Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift Guard let构造,仍然出现致命错误:索引超出范围_Swift_Xcode - Fatal编程技术网

Swift Guard let构造,仍然出现致命错误:索引超出范围

Swift Guard let构造,仍然出现致命错误:索引超出范围,swift,xcode,Swift,Xcode,我试图用以下代码解析一些数据: func findDate(data: String?) -> String { guard let date: String? = (data!.componentsSeparatedByString("T"))[0] else{ return "20000101" } return date! } func findDate(data: String?) -> String { guard let

我试图用以下代码解析一些数据:

func findDate(data: String?) -> String {
    guard let date: String? = (data!.componentsSeparatedByString("T"))[0] else{
        return "20000101"
    }
    return date!
}
func findDate(data: String?) -> String {
    guard let date: String? = (data?.componentsSeparatedByString("T"))?[0] else{
        return "20000101"
    }
    return date!
}

findDate(nil)
findDate("")
findDate("98588T99")
我尝试了guard结构以防止在找不到数据时出错,或者它具有不同的结构,但在运行它时仍然会出现错误:

致命错误:索引超出范围


有人知道如何解决这个问题吗?

请查看以下代码:

func findDate(data: String?) -> String {
    guard let date: String? = (data!.componentsSeparatedByString("T"))[0] else{
        return "20000101"
    }
    return date!
}
func findDate(data: String?) -> String {
    guard let date: String? = (data?.componentsSeparatedByString("T"))?[0] else{
        return "20000101"
    }
    return date!
}

findDate(nil)
findDate("")
findDate("98588T99")

请查看此代码:

func findDate(data: String?) -> String {
    guard let date: String? = (data!.componentsSeparatedByString("T"))[0] else{
        return "20000101"
    }
    return date!
}
func findDate(data: String?) -> String {
    guard let date: String? = (data?.componentsSeparatedByString("T"))?[0] else{
        return "20000101"
    }
    return date!
}

findDate(nil)
findDate("")
findDate("98588T99")

索引为零的元素的访问总是发生的。如果调用
组件(separatedBy:)
的结果返回空数组,则代码崩溃。此外,应避免强制展开
数据

这些崩溃的解决方案是使用数组的
first
属性,该属性是可选的,因此您可以安全地将其展开

guard let date = data?.components(separatedBy: "T").first else {
    return "20000101"
}
return date.
此外,还可以使用nil凝聚运算符简化此操作:

return data?.components(separatedBy: "T").first ?? "20000101"

索引为零的元素的访问总是发生的。如果调用
组件(separatedBy:)
的结果返回空数组,则代码崩溃。此外,应避免强制展开
数据

这些崩溃的解决方案是使用数组的
first
属性,该属性是可选的,因此您可以安全地将其展开

guard let date = data?.components(separatedBy: "T").first else {
    return "20000101"
}
return date.
此外,还可以使用nil凝聚运算符简化此操作:

return data?.components(separatedBy: "T").first ?? "20000101"

这里有两个问题:

1) 尝试访问不够大的数组的索引不会产生
nil
,它只会崩溃。例如,此代码将崩溃:

let strings: [String] = []
guard let firstString = strings[0] else {
    // couldn't find firstString
}
相反,请先使用
方法

let strings: [String] = []
guard let firstString = strings.first else {
    // couldn't find firstString
}
first
尝试访问数组的第一个元素,如果数组没有第一个元素,则返回
nil

2)
guard let
的目的是保证您得到的值不是
nil
。因此,您的
date
值应该是
String
类型,而不是
String?
,并且不必强制展开它。例如:

let strings: [String] = ["one", "two", "three"]
guard let firstString = strings.first else {
    // no first string
}
print(firstString) // firstString is not nil, no need to unwrap it

这里有两个问题:

1) 尝试访问不够大的数组的索引不会产生
nil
,它只会崩溃。例如,此代码将崩溃:

let strings: [String] = []
guard let firstString = strings[0] else {
    // couldn't find firstString
}
相反,请先使用
方法

let strings: [String] = []
guard let firstString = strings.first else {
    // couldn't find firstString
}
first
尝试访问数组的第一个元素,如果数组没有第一个元素,则返回
nil

2)
guard let
的目的是保证您得到的值不是
nil
。因此,您的
date
值应该是
String
类型,而不是
String?
,并且不必强制展开它。例如:

let strings: [String] = ["one", "two", "three"]
guard let firstString = strings.first else {
    // no first string
}
print(firstString) // firstString is not nil, no need to unwrap it

你能告诉我们调用语法吗?虽然
guard let
很有趣,但是你能不能更详细地分析一个日期并使用一个日期格式化程序来代替它?findDate(“20170707T141500Z”)Salman但是我还需要为我使用guard let结构的其他函数修复这个问题。问题不在于它告诉我“致命错误:在打开可选值时意外发现零”@JanMarkDannenberg Plz检查下面我的答案,如果您有任何困惑,请告诉我。!你能告诉我们调用语法吗?虽然
guard let
很有趣,但是你能不能更详细地分析一个日期并使用一个日期格式化程序来代替它?findDate(“20170707T141500Z”)Salman但是我还需要为我使用guard let结构的其他函数修复这个问题。问题不在于它告诉我“致命错误:在打开可选值时意外发现零”@JanMarkDannenberg Plz检查下面我的答案,如果您有任何困惑,请告诉我。!func findDate(data:String?->String{guard let date:String?=(data!.componentsSeparatedByString(“T”))。首先{return“20000101”}return date!}但现在它给了我另一个错误:致命错误:在展开可选值func findDate(data:String?->String时意外地发现了nil{guard let date:String?=(data!.componentsSeparatedByString(“T”))。首先{return“20000101”}return date!}但现在它给了我另一个错误:致命错误:在展开可选值时意外发现nil