我有两个相同的文件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)
}
首先,我建议通过CharacterSet.newlines
分开行,该行考虑所有常规的newline字符。
第二只只是过滤空线。
let lines = levelContents.components(separatedBy: CharacterSet.newlines)
.filter{ !$0.isEmpty }
ps:请注意,根据您的文本样本,将每条线通过单个结肠分开会导致右侧的领先空间字符。
一个选项是让您的代码忽略少于或超过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)
}