我有两个相同的文件level1.txt和lvl2.txt。两者都是UTF-8和行间距MacOS / Unix
ㅏ: ah
ㅓ: eo/uh
ㅡ: eu
ㅣ: i
ㅗ: o/oh
我正在阅读它们并将它们放入卡片对象中。但是,第一个文件工作,第二个文件检测到一个额外的换行符,它会创建一个空的数组元素,并给出一个超出范围的致命错误索引,因为没有空字符串的第一个和第二个元素。
我尝试通过在xcode编辑器和textEditor中创建一个新文件并从工作文本文件中复制/粘贴代码来重新创建level2.txt,但它仍然检测到不存在的换行符。有人可以解释为什么会发生这种情况或者更好的方法来创建在xcode项目中使用的文本文件,这些文件不会留下不可见的格式。谢谢。
if let levelFilePath = Bundle.main.path(forResource: "level\(indexPath.row + 1)", ofType: "txt") {
if let levelContents = try? String(contentsOfFile: levelFilePath) {
print(levelContents)
//Split Q and A's by linebreak
let lines = levelContents.components(separatedBy: "\n")
for line in lines{
//Splits each line into answer and clue
let parts = line.components(separatedBy: ":")
let card = Card(question: parts[0], answer: parts[1])
currentDeck.append(card)
}
答案 0 :(得分:1)
首先,我建议将CharacterSet.newlines
分隔为考虑所有常用换行符的行。
其次只是过滤空行。
let lines = levelContents.components(separatedBy: CharacterSet.newlines)
.filter{ !$0.isEmpty }
PS:请注意,根据您的文本示例,将每一行分隔为单个冒号会在右侧导致前导空格字符。
答案 1 :(得分:0)
一种选择是让您的代码忽略具有少于或多于2个组件的行,例如:
for line in lines{
//Splits each line into answer and clue
let parts = line.components(separatedBy: ":")
guard parts.count == 2 else { continue }
let card = Card(question: parts[0], answer: parts[1])
currentDeck.append(card)
}