Текстовые модификаторы в SwiftUI
Отдельно от обычных модификаторов вью в SwiftUI также есть модификаторы текста. Они применяют уникальные стили к вью Text и, вместо someView, возвращают такой же Text. Список доступных текстовых модификаторов можно посмотреть в Документации по текстовым вью в разделе «Стилизация текста вью» и других. Данные модификаторы имеют тип возвращаемого значения Text, к примеру, func foregroundColor(Color?) -> Text.
#Варианты использования текстовых модификаторов
Модификаторы текста отлично подходят для стилизации отрезков текста и могут использоваться внутри текстовой интерполяции.
Чтобы выделить определенные слова в предложении, мы можем интерполировать текст с применением модификатора bold().
Text("The market days are \(Text("Wednesday").bold()) and \(Text("Sunday").bold()).")
Мы также можем использовать модификаторы текста, чтобы применить определенные стили к ссылкам внутри Text вью, например добавить подчеркивание.
Text("For more information visit our \(Text("[website](https://example.com)").underline()).")
Обратите внимание, что модификатор foregroundColor() в этом случае работать не будет. Чтобы изменить цвет ссылок, мы должны применить tint() ко всему текстовому вью или интерполировать AttributedString с атрибутом foregroundColor. Цвет ссылки настраивается только на iOS. Дополнительные советы по оформлению ссылок смотрите в моем предыдущем посте Настройка стиля ссылок, встроенных в текст.
Как и в случае с интерполяцией текста, модификаторы текста можно использовать для стилизации фрагментов текста, объединенных с помощью конкатенации.
Text(verbatim: "Nil Coalescing").foregroundColor(.purple) + Text(verbatim: " Limited”)
Для локализуемого текста следует всегда отдавать предпочтение интерполяции текста, нежели конкатенации, т. к. он поддерживает гибкий порядок слов в предложении. Но вполне можно объединять текстовые вью знаком +, в случае, когда конечное вью не будет локализовано, если мы сочтем это более удобным.
Если с интерполяцией или конкатенацией текста мы случайно используем модификатор вью вместо модификатора текста, то получим ошибку сборки. Когда мы пытаемся применить foregroundStyle() вместо foregroundColor() к приведенному выше примеру, Xcode говорит: Невозможно преобразовать значение типа «some View" в ожидаемый тип аргумента »Text”.
// Error: Cannot convert value of type 'some View' to expected argument type 'Text'
Text(verbatim: "Nil Coalescing").foregroundStyle(.purple) + Text(verbatim: " Limited”)
Это происходит потому, что foregroundStyle() возвращает someView, а не Text.
#Объединение нескольких модификаторов в один
Если мы хотим объединить несколько текстовых модификаторов в один, чтобы сделать наш код более читаемым или упростить его повторное использование в разных местах, мы можем расширить Text с помощью функции, в которой в качестве возвращаемого типа будет Text.
Например, если нам нужно сделать некоторые части текста курсивом и жирным шрифтом одновременно, мы можем определить в Text метод boldItalic().
extension Text {
func boldItalic() -> Text {
self.bold().italic()
}
}
В дальнейшем мы можем использовать этот только что определенный текстовый модификатор везде, где возможно использовать модификаторы стандартного фреймворка.
Text("The party is \(Text(“tomorrow").boldItalic())")