Текстовые модификаторы в SwiftUI

Отдельно от обычных модификаторов вью в SwiftUI также есть модификаторы текста. Они применяют уникальные стили к вью Text и, вместо someView, возвращают такой же Text. Список доступных текстовых модификаторов можно посмотреть в Документации по текстовым вью в разделе «Стилизация текста вью» и других. Данные модификаторы имеют тип возвращаемого значения Text, к примеру, func foregroundColor(Color?) -> Text.

#Варианты использования текстовых модификаторов

Модификаторы текста отлично подходят для стилизации отрезков текста и могут использоваться внутри текстовой интерполяции.

Чтобы выделить определенные слова в предложении, мы можем интерполировать текст с применением модификатора bold().

Text("The market days are \(Text("Wednesday").bold()) and \(Text("Sunday").bold()).")
Текстовые модификаторы в SwiftUI

Мы также можем использовать модификаторы текста, чтобы применить определенные стили к ссылкам внутри Text вью, например добавить подчеркивание.

Text("For more information visit our \(Text("[website](https://example.com)").underline()).")
Текстовые модификаторы в SwiftUI

Обратите внимание, что модификатор foregroundColor() в этом случае работать не будет. Чтобы изменить цвет ссылок, мы должны применить tint() ко всему текстовому вью или интерполировать AttributedString с атрибутом foregroundColor. Цвет ссылки настраивается только на iOS. Дополнительные советы по оформлению ссылок смотрите в моем предыдущем посте Настройка стиля ссылок, встроенных в текст.

Как и в случае с интерполяцией текста, модификаторы текста можно использовать для стилизации фрагментов текста, объединенных с помощью конкатенации.

Text(verbatim: "Nil Coalescing").foregroundColor(.purple) + Text(verbatim: " Limited”)
Текстовые модификаторы в SwiftUI

Для локализуемого текста следует всегда отдавать предпочтение интерполяции текста, нежели конкатенации, т. к. он поддерживает гибкий порядок слов в предложении. Но вполне можно объединять текстовые вью знаком +, в случае, когда конечное вью не будет локализовано, если мы сочтем это более удобным.

Если с интерполяцией или конкатенацией текста мы случайно используем модификатор вью вместо модификатора текста, то получим ошибку сборки. Когда мы пытаемся применить 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())")

Подписывайся на наши соцсети: Telegram / VKontakte

Вступай в открытый чат для iOS-разработчиков: t.me/swiftbook_chat

11
Начать дискуссию