Как скопировать все атрибуты из одной 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)

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