Получение строк, соответствующих каждому атрибуту, выполняемому в Swift AttributedString

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

Например, если уценка имеет вид « bold moreBold italicText », построенные массивы будут иметь вид

      boldWords: [String] = ["bold", "moreBold"]
italicWords: [String] = ["italicText"]

Код будет выглядеть примерно так:

      let markdown = "**bold**  **moreBold**  *italicText*"
let attributedStr = try! AttributedString(markdown: markdown)

var boldWords: [String]
var italicWords: [String]

 
for run in attributedStr.runs {
    if let intent = run.inlinePresentationIntent {
        if intent == .emphasized {
            attributedStr[run.range].backgroundColor = .red
            italicWords += word(for: run, in: attributedStr)
        }
        else if intent == .stronglyEmphasized {
        
            boldWords += word(for: run, in: attributedStr)
        }
    }
}

Для каждогоrunв атрибутированной строке я хочу получить слово в исходной уценке, соответствующее этому запуску. Другими словами, что делает функцияword()выглядит как?

      func word(for run: Run, in attributedStr: AttributedString) -> String
{
    return ???
}

С другой точки зрения,for run in attributedString.runs {...}конструкция обычно используется для стилизации ряда символов; Я хочу иметь возможность сделать обратное, получив строки, которые изначально были стилизованы таким образом.

1 ответ

С другой точки зрения,for run in attributedString.runs {...}конструкция обычно используется для стилизации ряда символов; Я хочу иметь возможность сделать обратное, получив строки, которые изначально были стилизованы таким образом.

Так:

      String(attributedStr.characters[run.range])

что делает функцияword()выглядит как?

        func word(for run: Run, in attributedStr: AttributedString) -> String
 {
     return ???
 }

Так:

      func word(
    for run: AttributedString.Runs.Element, 
    in attributedStr: AttributedString
) -> String {
    String(attributedStr.characters[run.range])
}

Пример (из Playground, с использованием вашего собственного образца текста):

      let markdown = "**bold**  **moreBold**  *italicText*"
let attributedStr = try! AttributedString(markdown: markdown)

func word(
    for run: AttributedString.Runs.Element, 
    in attributedStr: AttributedString
) -> String {
    String(attributedStr.characters[run.range])
}

for run in attributedStr.runs {
    print(word(for: run, in: attributedStr))
}

Выход:

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