2017-07-07 38 views
0

我試圖用這個代碼來分析一些數據:衛隊讓建築,仍然得到致命錯誤:超出範圍的索引

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

我試圖保護結構以防止出現錯誤時,有沒有發現數據或它有不同的結構,但我仍然得到錯誤,當我運行它:

致命錯誤:超出範圍的索引

是否有人知道如何解決這一問題?

+0

你可以給我們調用語法嗎? –

+0

雖然'guard let'很有趣,但是您可以更多地討論解析日期並使用dateformatter嗎? – Larme

+0

findDate(「20170707T141500Z」)Salman –

回答

0

請看看這個代碼:

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

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

在指數元素的接入零總是會發生。如果對components(separatedBy:)的調用結果返回空數組,則代碼將崩潰。此外,你應該避免強行解開data

這些崩潰的解決方案是使用數組的first屬性,該屬性是可選的,因此您可以安全地展開它。

guard let date = data?.components(separatedBy: "T").first else { 
    return "20000101" 
} 
return date. 

此外,這可以然後使用零合併運算符被簡化:

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

謝謝,我試過了: –

+0

func findDate(data:String?) - > String {{0} {0} {0} let let date:String? =(data!.componentsSeparatedByString(「T」))。第一個else { return「20000101」 } return date! } –

+0

但現在它給了我另一個錯誤:致命錯誤:意外地發現零而解包可選值 –

0

這裏有兩個問題:

1)試圖訪問ISN」的陣列的指數足夠大不會產生nil,它只是崩潰。例如,該代碼將崩潰:

let strings: [String] = [] 
guard let firstString = strings[0] else { 
    // couldn't find firstString 
} 

相反,使用first方法:

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 
相關問題