2016-11-02 63 views
4

因此,我有一個函數刪除字符串尾部的尾隨「,」(逗號+空格),即使我發現上述錯誤確保字符串不是空的。下面的代碼:致命錯誤:無法從空字符串中形成字符

print("stripping trailing commas") 
     for var detail in details { 
      if detail.contains(",") { 
print(detail) 
       detail.remove(at: detail.endIndex) // <-- Removes last space 
       detail.remove(at: detail.endIndex) // <-- Removes last comma 
      } 
     } 

...結果詮釋以下控制檯輸出:

stripping trailing commas 
2016, 
fatal error: Can't form a Character from an empty String 

一審detail.remove(at: detail.endIndex)正在被調試器突出,而我不能確定的空間從控制檯消息中提出,我在列表中的每個條目的末尾添加「,」,以便實際包含逗號的任何字符串不僅應具有字符(如控制檯指示的),而且應該在其中添加兩個字符需要剝離的那一端。

在此先感謝您的任何幫助是什麼導致錯誤以及如何解決?

+0

在這兩種情況下,索引都需要提前1個字符。 –

+0

謝謝。添加at:detail.index(before:detail.endIndex)'做了訣竅。想要把它作爲一個快速答案,所以我可以給你信貸? –

回答

2

一個簡單的方法來做到這一點,而無需使用import Foundation(需要)或計算指數會是這樣的:

let details = ["one, two, three, ", "a, b", "once, twice, thrice, so nice, ", ""] 

let filtered = details.map { (original: String) -> String in 
    guard original.hasSuffix(", ") else { return original } 
    return String(original.characters.dropLast(2)) 
} 

print(filtered) // -> "["one, two, three", "a, b", "once, twice, thrice, so nice", ""]\n" 

這不會刪除任何空字符串e返回數組。如果您需要該功能,可以輕鬆添加。

+0

有趣的是,如果我試圖做'details.map {$ 0.characters.split(separator:「,」)。first}'可能會更簡潔。然而,在這種情況下,每個細節都是完整的列表(即[「一,二,三,」,「a,b,c,」等)),我只想刪除最後一個(無關的)逗號。 –

+0

該代碼不起作用。它產生了類型爲Array <可選的>的結果。這就是爲什麼我的例子更復雜,要把它放到'Array '。但是,如果有多個逗號,我的代碼將無法工作。我正在更新它以符合您的要求。 – ColGraff

+0

您的更新非常有幫助,非常感謝。我再也看不到它了,但我認爲你的原始版本返回了可選項(在guard語句中有一個返回零),並且我不是導入基金會,但仍然可以調用contains ...儘管更全面和翔實的回覆所以再次感謝您抽出時間,我會將答案改爲您的答案。 –

9

嘗試改變

detail.remove(at: detail.endIndex) 

detail.remove(at: detail.index(before: detail.endIndex)) 
相關問題