2016-12-23 2 views
0

У меня есть два одинаковых файла level1.txt и lvl2.txt. Оба UTF-8 и межстрочный интервал MacOS/Unixtxt файлы с невидимыми разрывами строк

ㅏ: ah 
ㅓ: eo/uh 
ㅡ: eu 
ㅣ: i 
ㅗ: o/oh 

Я читаю их и помещая их в объекты карты. Однако первый файл работает и второй обнаруживает дополнительный разрыв строки, который создает пустой элемент массива и дает мне фатальный индекс ошибки вне диапазона, потому что не существует первого и второго элементов пустой строки.

Я пробовал воссоздать level2.txt, создав новый файл как в редакторе xcode, так и в textEditor и скопировав/введя код из рабочего текстового файла, но он все еще обнаруживает разрыв строки, которого там нет. Может кто-нибудь объяснить, почему это происходит, или лучший способ создания текстовых файлов, которые будут использоваться в проектах 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

Один из вариантов, чтобы ваш код игнорировать линии с меньшим количеством или более 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) 
} 
+0

Спасибо, Джим. Я уверен, что буду использовать это позже в своем проекте. –

1

Прежде всего, я рекомендую, чтобы отделить линии от CharacterSet.newlines которая учитывает все обычные символы новой строки ,

Во-вторых, просто фильтруйте пустые строки.

let lines = levelContents.components(separatedBy: CharacterSet.newlines) 
         .filter{ !$0.isEmpty } 

PS: Имейте в виду, что разделение каждой строки на один двоеточие вызывает символ ведущего пробела в правой части в соответствии с вашим образцом.

+0

Спасибо Вадян. Это сработало! Кроме того, хорошее предложение о том, чтобы не включать ведущее место в текстовом файле. –

Смежные вопросы