Прочитайте текст из всех файлов rtf в каталоге и быстро создайте мастер-файл

Контекст У меня есть приложение, в котором пользователь может написать несколько «сцен». Они сохраняются в виде отдельного файла. Мне нужно предложить пользователю 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
    }

Для начала мне просто нужна помощь в том, как получить строки в массиве — после этого я могу попробовать написать новый мастер!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
164
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вам нужен массив 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) }

Эй, спасибо за это - я думаю, что это сработает, но я получаю сообщение об ошибке компактной карты ... «compactMap» недоступен из-за уровня защиты «fileprivate». Я посмотрю на это сейчас!

nc14 08.06.2019 11:24

Эй, я изменил это на flatMap, и все заработало нормально — теперь мне нужно решить, как разделить строки, чтобы между ними была пара строк!

nc14 08.06.2019 13:28

Другие вопросы по теме