У меня есть структура, определенная следующим образом, как часть объекта. Я пытаюсь закодировать это для использования с NSCoder с целью сохранения, а также функции отмены / повтора.
struct myCol {
float rd;
float grn;
float blu;
float alp;
} toolColor;
Итак, есть методы кодирования, например. -encodeBool:, -encodeFloat:, -encodeObject: и т. д. Но как это сделать для структуры?





Я думаю, вам следует подумать о том, чтобы вы структурировали myCol как буфер памяти и закодировали его чем-то вроде функции encodeBytes. Длина буфера = размер вашей структуры
Спасибо ребята. Поскольку требуется объект, я решил использовать NSColor вместо struct. Думаю, я должен был это сделать в первую очередь! Но я учусь.
Фактически, упаковка структуры в простой NSValue не делает ее кодируемой. Просто узнал это на собственном горьком опыте. Подробности почему находятся в документации Apple, «Руководство по программированию архивов и сериализации для какао», «Кодирование и декодирование типов данных C». Я сделал свою категорию похожей на NSValue (NSValueUIGeometryExtensions), и она отлично работает; но я еще не нашел способ добавить один параллельный NSCoder (UIGeometryKeyedCoding) и использовать его, за исключением создания подкласса NSValue.
Переход по маршруту encodeBytes прекрасен при условии, что данные никогда не будут перемещаться между 32- и 64-битными устройствами. Теперь, когда 5s является 64-битным устройством, я считаю, что вы столкнетесь с серьезными проблемами, если эти данные, скажем, синхронизируются с iCloud, а затем переносятся с 32-битного устройства на 64-битное устройство. Единственный надежный способ - индивидуально кодировать каждый тип данных по ходу дела ... я на самом деле надеюсь, что это не так, поэтому, если кто-то не согласен, ответьте!
Вы можете сделать это так, как говорит макропас, или обернуть это в объект NSValue.