LoginSignup
0
2

More than 1 year has passed since last update.

required init?(coder: NSCoder) を今更調べた

Last updated at Posted at 2021-10-16

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をすると自動的にそうなるらしい。
うーん。理解が三ミリくらいしか進まなかった

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2