Как скопировать все атрибуты из одной AttributedString в другую без преобразования в NSAttributedString?
У меня есть AttributedString с набором атрибутов, которые я не знаю до времени выполнения. Теперь я хочу добавить/добавить другую строку. Как сделать так, чтобы добавленная строка имела те же атрибуты, что и исходная AttributedString? Копирование атрибутов из первого символа допустимо, так как вся AttributedString имеет однородные атрибуты.
Я вижу, что могу создать новую AttributedString с новым добавленным текстом, а затем вызвать для нее «setAttributes», но не вижу способа получить AttributeContainer из исходной строки? Есть ли способ сделать это, не копируя каждый атрибут по отдельности?
Я вижу, что это возможно с NSAttributedString, но возможно ли это без преобразования в NSAttributedString?
Я надеюсь, что смогу сделать что-то вроде:
let originalText: AttributedString // Some existing string with arbitrary attributes
var newText = AttributedString("text_I_want_to_prepend_to_originalText")
newText.setAttributes(originalText.getAttributes(at: 0))
newText.append(originalText)
2 ответа
Контейнеры прикреплены к каждомуAttributedString.Run
(это диапазон символов с одинаковыми атрибутами). Вы можете получить к ним доступ следующим образом:
newText.setAttributes(originalText.runs.first!.attributes)
Очевидно, вы должны тщательно подумать о том, как это будет работать, если строка пуста, так как это приведет к сбою. Но основной подход заключается в доступе к свойству.
Есть индекс наruns
который принимаетAttributeString.Index
, так что версия, которая более точно соответствует вашей оригинальнойgetAttributes(at: 0)
было бы:
newText.setAttributes(originalText.runs[originalText.startIndex].attributes)
Вы можете использовать init(_:attributes:) | Документация Apple Developer с набором атрибутов по умолчанию:
let defaultAttributes = AttributeContainer().font(.body).foregroundColor(.green)
var newText = AttributedString("text_I_want_to_prepend_to_originalText",
attributes: string.runs.first?.attributes ?? defaultAttributes)