NSAttributed String отсутствует возвращаемое значение

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

func populateTextViewWithCurrentScene() {

    let fileURL = getFileURL()

    do {
        let attributedStringWithRtf:NSAttributedString = try NSAttributedString(
            url: fileURL,
            options: [.documentType: NSAttributedString.DocumentType.rtf],
            documentAttributes: nil
        )
        self.textViewOutlet.attributedText = attributedStringWithRtf
    }
    catch {
        print("failed to populate text view with current scene with error: \(error)")

    }

}

До сих пор я пробовал это, следуя руководству здесь Как я могу создать функцию с обработчиком завершения в Swift?, и я также пробовал версию, объявляющую var перед функцией. Ошибка, которую я получаю ниже, не может вызвать значение нефункционального типа «NSAttributedString».

Я знаю, что есть довольно много вопросов по этому поводу, но многие из них касаются старых версий Swift.

func populateTextViewWithCurrentScene(rtfString: NSAttributedString) -> Void {

    let fileURL = getFileURL()
    do {
        let rtfString:NSAttributedString = try NSAttributedString(
            url: fileURL,
            options: [.documentType: NSAttributedString.DocumentType.rtf],
            documentAttributes: nil
        )
    }
    catch {
        print("failed to populate text view with current scene with error: \(error)")
    }
    rtfString()
}

Что не так с первой функцией? Вопрос не имеет ничего общего с обработчиками завершения.

vadian 04.06.2019 18:00

Вам следует прочитать раздел Параметры функции и возвращаемые значения книги Swift. Обратите внимание, что вам не нужен обработчик завершения. Просто нормальное возвращаемое значение.

rmaddy 04.06.2019 18:04

@vadian Я хочу использовать вывод (строку с атрибутами), чтобы затем установить свойство .text textView в другом месте кода. Поэтому мне нужно вернуть (я думаю) атрибутированную строку .i.e. удалите эту строку.... self.textViewOutlet.attributedText = attributeStringWithRtf, чтобы я мог использовать атрибутированную строку в нескольких текстовых представлениях в нескольких местах кода, не записывая все это снова

nc14 04.06.2019 18:04

@rmaddy Я пытался это сделать, но не могу получить доступ к attributeStringWithRtf для возврата?

nc14 04.06.2019 18:06

Покажите эту попытку в своем вопросе.

rmaddy 04.06.2019 18:07
Стоит ли изучать 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
5
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я пошел дальше и создал extension из UIViewController, который должен предоставить то, что вы ищете. Комментарии включены для каждой строки, чтобы объяснить решения, которые я принял.

Не стесняйтесь комментировать, если какая-то часть неясна или не работает должным образом.

import UIKit

// You mentioned wanting to extend your viewcontroller
// so I extend UIViewController to support that
extension UIViewController {
    // Returns an optional NSAttributedString, based upon successfully loading the file contents
    func loadString() -> NSAttributedString? {
        do {
            // Everything is cleaned up into a single return command,
            // including the getFileURL, which can be used as a parameter instead
            // of creating a variable for it
            return try NSAttributedString(url: getFileURL(),
                                          options: [.documentType: NSAttributedString.DocumentType.rtf],
                                          documentAttributes: nil)
        } catch {
            // If this fails, use your existing print command
            print("failed to populate text view with current scene with error: \(error)")
            // and then return nil to indicate that nothing was loaded
            return nil
        }
    }
}

Это основано на комментариях ниже от вас и rmaddy.

Как упоминалось в моем первоначальном комментарии, решение заключалось не в объединении попыток и возвратов, а просто в оптимизации кода.

Вы можете посмотреть на функцию таким образом:

"I want to try and open a file that is located at getFileURL(), and would like to use some options I specify with my options: parameter. Since this action can fail, Xcode makes me use try. Assuming that this file is successfully opened, then return the contents back to the caller in the form of an NSAttributedString. However, if this fails, print out a message telling me why it failed and then return a nil to indicate that no data is returned."

Предлагаю переименовать метод.

rmaddy 04.06.2019 18:08

спасибо за это - ключ (о котором я не знал) заключался в том, что вы можете предварительно отложить попытку с возвратом (вероятно, глупое упущение, но все еще относительно новое для кодирования, поэтому я уверен, что это поможет другим в такой же ситуации)

nc14 04.06.2019 18:18

@ nc14 «Ключ» не имеет ничего общего с добавлением try к return. Вы можете легко записать это как let attrStr = try NSAttributedString(....), а затем return attrStr.

rmaddy 04.06.2019 18:32

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