Storyboardを使用せずUIViewやcellなどのサブViewをinit()すると
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
これを付けて!!と出てくるので,これまでは何も考えずにfixを押してましたが今更調べてみました。
そもそも
init?(coder: NSCoder) {
}
これはNSCodingプロトコルで定義されているメソッドらしい。(単純にこのプロトコルをUIViewが準拠しているからお知らせしてくれる)
NSCodingとは二つのメソッドを定義している
init?...
他に func encode(with: NSCoder)
が存在する。
ドキュメントをそのまま翻訳すると、
init?
⇨ アーカイブされていないデータから初期化されたオブジェクトをかえす。必須なやつだよ
encode
⇨ アーカイブで受け取ったやつをエンコードするよん
あんましよくわからない。。(英語弱者なだけかもしれないけど。。)
続いて NSCodingProtocol
NSCodingProtocol
はクラスをエンコード、デコードするための二つのメソッドを提供しているよ(init?
と encode()
)。アーカイブやディストリビューションをするための基盤となるプロトコルです。
アーカイブってなに?
⇨オブジェクトとデータをディスクに保存し格納すること
ディストリビューションってなに?
⇨オブジェクトやデータと異なるスレッド間やプロセスでコピーすること))
OOP設計の原則に基づいてエンコード、デコードされるオブジェクトはインスタンス変数のエンコードやデコードをする責任があるので、
init?()
提供されたデータから自身をインスタンス化するようにオブジェクトに指示する必要がある。
encode()
提供されたインスタンス変数をエンコードする(アーカイブする)指示をオブジェクトに指示する
requiredが出てくるのではprotocolにinitをすると自動的にそうなるらしい。
うーん。理解が三ミリくらいしか進まなかった