Labo288

プログラミングのこと、GISのこと、パソコンのこと、趣味のこと

自作クラスをNSDataに変換したりUserDefaultsに保存するために

はじめに

Swiftでクラスをエンコードする(=NSData型に変換する)場合は、そのクラスがNSObjectを継承していて、かつNSCodingプロトコルに準拠している必要があります。 カスタムクラスをUserDefaultsに保存したい場合等に必要となる知識ですが、かなりハマったので整理のために記事にします。

ハマりポイント

まず自作クラスをUserDefaultsに保存したい、というのは割とありふれた用件であり、調べると様々な記事を見つける事が出来ます。

www.macky-studio.com

しかしながらそれらの方法は、自作クラスのクラス変数がすべてNSString等の基本クラスである場合にのみ可能です。私の場合、UserDefaultsに保存したいクラスは、そのクラス変数にもカスタムクラスを含んでおり、以上の方法では解決しません。

解決策

NSDataに変換したい、またはUserDefaultsに保存したいクラス(=親クラス)のクラス変数にカスタムクラス(=子クラス)が含まれている場合、親クラスだけではなく子クラスも、NSObjectを継承しNSCodingプロトコルに準拠する必要があります。つまり言い換えると、カスタムクラスをNSCodingに準拠させるという事は、そのクラス変数すべてもNSCodingに準拠していなければならないという事です。この事については調べてもなかなか出てこなかった、けど、よく考えれば当たり前だと思う。