Я пытаюсь превратить эту функцию внутри 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()
}
Вам следует прочитать раздел Параметры функции и возвращаемые значения книги Swift. Обратите внимание, что вам не нужен обработчик завершения. Просто нормальное возвращаемое значение.
@vadian Я хочу использовать вывод (строку с атрибутами), чтобы затем установить свойство .text textView в другом месте кода. Поэтому мне нужно вернуть (я думаю) атрибутированную строку .i.e. удалите эту строку.... self.textViewOutlet.attributedText = attributeStringWithRtf, чтобы я мог использовать атрибутированную строку в нескольких текстовых представлениях в нескольких местах кода, не записывая все это снова
@rmaddy Я пытался это сделать, но не могу получить доступ к attributeStringWithRtf для возврата?
Покажите эту попытку в своем вопросе.





Я пошел дальше и создал 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 myoptions:parameter. Since this action can fail, Xcode makes me usetry. Assuming that this file is successfully opened, then return the contents back to the caller in the form of anNSAttributedString. However, if this fails, print out a message telling me why it failed and then return anilto indicate that no data is returned."
Предлагаю переименовать метод.
спасибо за это - ключ (о котором я не знал) заключался в том, что вы можете предварительно отложить попытку с возвратом (вероятно, глупое упущение, но все еще относительно новое для кодирования, поэтому я уверен, что это поможет другим в такой же ситуации)
@ nc14 «Ключ» не имеет ничего общего с добавлением try к return. Вы можете легко записать это как let attrStr = try NSAttributedString(....), а затем return attrStr.
Что не так с первой функцией? Вопрос не имеет ничего общего с обработчиками завершения.