iOS. Приемы программирования
Шрифт:
Постановка задачи
Вы считаете, что набор типов данных, представленных в Core Data, не удовлетворяет стоящим перед вами требованиям. Вам хотелось бы использовать в объектах моделей и дополнительные типы данных, например UIColor. Но такие объекты не содержатся в Core Data в готовом виде.
Решение
Используйте преобразуемые типы данных.
Обсуждение
Core Data позволяет создавать для объектов моделей свойства, а потом присваивать этим свойствам
Допустим, вы хотите создать в Core Data объект модели и назвать этот объект Laptop. У данного объекта будет два свойства: model типа String и color, которое должно относиться к типу UIColor. В Core Data не предоставляется такой тип данных, поэтому для его получения нам придется создать подкласс от NSValueTransformer. Назовем этот класс ColorTransformer. Вот что станем делать при его реализации.
1. Переопределим его метод класса allowsReverseTransformation и вернем от него значение YES. Так мы сообщим Core Data о возможности преобразования цветов в данные и обратно.
2. Переопределим метод transformedValueClass этого класса и возвратим от него имя класса NSData. Возвращаемое значение этого метода сообщает Core Data, в какой класс вы будете преобразовывать специальное значение. В данном случае происходит преобразование UIColor в NSData. Поэтому вы должны вернуть от этого метода имя класса NSData.
3. Переопределим метод экземпляра transformedValue:, относящийся к преобразователю. В нашем методе будем брать входящее значение (которое в данном случае будет экземпляром UIColor), преобразовывать его в NSData и возвращать эти данные.
4. Переопределим метод экземпляра reverseTransformedValue:, относящийся к преобразователю, и сделаем это с совершенно противоположной целью. Берем входящее значение (здесь — данные) и преобразуем его в цвет.
Имея всю эту информацию, продолжим реализацию преобразователя. Чтобы сохранять цвет как данные, просто разделим его на целочисленные компоненты, которые будут сохраняться в массиве:
Теперь возвращаемся к модели данных. Создадим управляемый объект Laptop и его атрибуты/свойства. Убедитесь, что атрибут color является преобразуемым. Выделив этот атрибут, нажмите на клавиатуре Alt+Command+3 и откройте Model Inspector (Инспектор модели) для этого атрибута. В поле name преобразуемого класса введите имя специального преобразователя. В данном случае это будет ColorTransformer (рис. 16.21).
Рис. 16.21. Создание модели с преобразуемым атрибутом
Теперь воспользуемся приемами, изученными в разделе 16.2, и сгенерируем файл класса для управляемого объекта Laptop. После этого перейдем к заголовочному файлу этого управляемого объекта. Как видите, атрибут color рассматриваемого класса относится к типу id:
Уже неплохо. Но чтобы сделать код еще лучше, в частности помочь компилятору выявлять возможные проблемы (они могут возникать, если присваивать этому свойству значения неподходящих типов), вручную изменим этот тип данных на UIColor: