Получение строк, соответствующих каждому атрибуту, выполняемому в 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