Создание текстового поля с привязкой, отличной от строки.

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

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

Первым предварительным условием является возможность преобразования пользовательского объекта как из строки, так и в строку. Чтобы преобразовать его в строку, ваш пользовательский объект должен соответствовать CustomStringConvertible. Чтобы преобразовать его из строки, вы должны предоставить функцию.

Эта функция должна принимать строку в качестве параметра и возвращать необязательное значение вашего типа. Для многих встроенных типов это просто, например, для float:return Float(inputString). Для пользовательских типов вам нужно будет настроить собственную функцию преобразования.

Пример функции преобразования для пользовательского объекта можно увидеть ниже:

Второй предпосылкой является представление, показывающее, когда текст в текстовом поле недействителен. Вы можете предоставить простое текстовое представление с сообщением об ошибке или более сложное представление. Всякий раз, когда преобразование текстового поля возвращает ноль, появляется это представление.

Обратите внимание, что стекирование представлений не используется, поэтому оно будет отображаться вертикально, если GenericTextField находится в VStack, или горизонтально в HStack.

Как только оба этих предварительных условия выполнены, вы можете использовать GenericTextField, как показано ниже.

Использование этого кода внутри VStack приводит к следующему:

Полный код GenericTextField можно найти ниже. Любые изменения стиля TextField должны выполняться внутри класса GenericTextField.

Я надеюсь, что вы нашли это руководство и код полезными. Не стесняйтесь использовать GenericTextField в любом своем коде!