自作クラスをNSDataに変換したりUserDefaultsに保存するために
はじめに
Swiftでクラスをエンコードする(=NSData型に変換する)場合は、そのクラスがNSObjectを継承していて、かつNSCodingプロトコルに準拠している必要があります。 カスタムクラスをUserDefaultsに保存したい場合等に必要となる知識ですが、かなりハマったので整理のために記事にします。
ハマりポイント
まず自作クラスをUserDefaultsに保存したい、というのは割とありふれた用件であり、調べると様々な記事を見つける事が出来ます。
しかしながらそれらの方法は、自作クラスのクラス変数がすべてNSString等の基本クラスである場合にのみ可能です。私の場合、UserDefaultsに保存したいクラスは、そのクラス変数にもカスタムクラスを含んでおり、以上の方法では解決しません。
解決策
NSDataに変換したい、またはUserDefaultsに保存したいクラス(=親クラス)のクラス変数にカスタムクラス(=子クラス)が含まれている場合、親クラスだけではなく子クラスも、NSObjectを継承しNSCodingプロトコルに準拠する必要があります。つまり言い換えると、カスタムクラスをNSCodingに準拠させるという事は、そのクラス変数すべてもNSCodingに準拠していなければならないという事です。この事については調べてもなかなか出てこなかった、けど、よく考えれば当たり前だと思う。