Контекст У меня есть приложение, в котором пользователь может написать несколько «сцен». Они сохраняются в виде отдельного файла. Мне нужно предложить пользователю 2 варианта экспорта (экспортировать все сцены по отдельности или все вместе в один мастер-файл).
Что я пытаюсь сделать Мой подход на данный момент состоит в том, чтобы попытаться получить URL-адреса каждого файла с расширением .rtf. Затем, чтобы перебрать каждый из них, извлекая NSAttributedString. Наконец, я планирую записать каждый по очереди в основной файл .rtf.
Что я пробовал Используя идеи из различных других ответов (например, здесь и здесь по аналогичным вопросам, я пытаюсь прояснить ниже, что я аннотировал. Излишне говорить, что я немного застрял и растерялся, что делать дальше:
@IBAction func exportPressed(_ sender: Any) {
//THIS BIT RETRIEVES THE URLS OF EACH .RTF FILE AND PUTS THEM INTO AN ARRAY CALLED SCENEURLS. THIS BIT WORKS FINE AND I'VE TESTED BY PRINTING OUT A LIST OF THE URLS.
do {
let documentsURL = getDocumentDirectory()
let docs = try FileManager.default.contentsOfDirectory(at: documentsURL, includingPropertiesForKeys: [], options: [.skipsHiddenFiles, .skipsSubdirectoryDescendants])
let scenesURLs = docs.filter{ $0.pathExtension == "rtf" }
//THIS BIT TRYS TO RETURN THE NSATTRIBUTEDSTRING FOR EACH OF THE SCENE URLS. THIS BIT THROWS UP MULTIPLE ERRORS. I SUPPOSE I WOULD WANT TO ADD THE STRINGS TO A NEW ARRAY [SCENETEXTSTRINGS] SO I COULD THEN LOOP THROUGH THAT AND WRITE THE NEW MASTER FILE WITH TEXT FROM EACH IN THE RIGHT ORDER.
scenesURLs.forEach {_ in
return try NSAttributedString()(url: scenesURLs(),
options: [.documentType: NSAttributedString.DocumentType.rtf],
documentAttributes: nil)
} catch {
print("failed to populate text view with current scene with error: \(error)")
return nil
}
}
} catch {
print(error)
}
//THERE NEEDS TO BE SOMETHING HERE THAT THEN WRITES THE STRINGS IN THE NEW STRINGS ARRAY TO A NEW MASTER FILE
}
Для начала мне просто нужна помощь в том, как получить строки в массиве — после этого я могу попробовать написать новый мастер!





Если вам нужен массив NSAttributedString из массива URL-адресов файлов, вы можете использовать map вместо forEach. У вас также есть несколько проблем с синтаксисом, которые необходимо исправить.
Замените использование forEach на:
let attributedStrings = scenesURLs.compactMap { (url) -> NSAttributedString? in
do {
return try NSAttributedString(url: url, options: [.documentType: NSAttributedString.DocumentType.rtf], documentAttributes: nil)
} catch {
print("Couldn't load \(url): \(error)")
return nil
}
}
Если вам не нужно регистрировать ошибку, это можно упростить до:
let attributedStrings = scenesURLs.compactMap {
return try? NSAttributedString(url: $0, options: [.documentType: NSAttributedString.DocumentType.rtf], documentAttributes: nil)
}
Чтобы создать один финальный NSAttributedString из массива, вы можете сделать:
let finalAttributedString = attributedStrings.reduce(into: NSMutableAttributedString()) { $0.append($1) }
Эй, я изменил это на flatMap, и все заработало нормально — теперь мне нужно решить, как разделить строки, чтобы между ними была пара строк!
Эй, спасибо за это - я думаю, что это сработает, но я получаю сообщение об ошибке компактной карты ... «compactMap» недоступен из-за уровня защиты «fileprivate». Я посмотрю на это сейчас!