init?(coder aDecoder:NSCoder)
Init Coder Adecoder
スーパークラスの指定されたイニシャライザーをマストで呼び出す
「必須」の初期化子「init(coder :)」は、次のサブクラスによって提供される必要があります。
使用したい場合Swift
実装を作成しましたNSCoding
プロトコルクラス(UIView,UIViewController
)、非常に恥ずかしい状況になりますrequired init?(coder aDecoder: NSCoder)
、それでも実現する必要がありますが、これが何なのか、何に使われているのかわからないかもしれませんが、それが何であるかを単に知っているかもしれませんNSCoding
これは単なるプロトコルメソッドです。
in
Swift
Inで、親クラスのコンストラクターをオーバーライドする必要があり、親クラスがNSCoding
を実装する場合は、このコンストラクターもサブクラスに実装する必要があります。required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }
- 1
- 二
- 3
したがって、すべてが正常であると思います。申し訳ありませんが、間違っていました。
Swift
安全上の理由から、クラスを初期化するときは、クラスのすべての内部プロパティを初期化する必要があります(通常、デフォルト値が割り当てられます)。コンパイラは次のエラーを報告します。
class ViewController: UIViewController { var name: String var age : Int init() { name = 'Paul' age = 24 super.init(nibName: nil, bundle:nil) } required init(coder: NSCoder) { super.init(coder: coder) } }
- 1
- 二
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 十一
- 12
- 一部の人は話しましたが、次のように初期化する必要があると言った人は誰でも
var age : Int?
する必要はありませんsuper.init()
前に初期化する必要があります?
オプションの記号です、この方法書き込みでは、age
属性はオプションであり、オプションであると規定されています。オプションは、割り当てない場合のデフォルトの割り当てを指しますnil
したがって、age
定義時に初期化されない場合でも、ただし、すでに初期化されています(nilはnull値を表し、OCの空のオブジェクトとは異なります。たとえば、Swiftでは、age = nilを使用してオブジェクトを解放することはできません)、 ただし、カスタムコンストラクターを実装する場合は、その方法、 たぶんそうだ
class ViewController: UIViewController { let name: String init() { name = 'Paul' super.init(nibName: nil, bundle:nil) } init(name aName : String) { name = 'Paul' super.init(nibName: nil, bundle:nil) } required init(coder: NSCoder) { name = 'Paul' \ simply write it, super.init(coder: coder) } }
- 1
- 二
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 十一
- 12
- 13
- 14
- 15
10個または100個の属性がある場合はどうなりますか?時間がかかるので、ocのような割り当てメソッドを書くだけです
class ViewController: UIViewController { let name: String init() { setup() super.init(nibName: nil, bundle:nil) } init(name aName : String) { setup() super.init(nibName: nil, bundle:nil) } required init(coder: NSCoder) { setup() super.init(coder: coder) } func setup() { name = 'Paul' age = 25 } }
- 1
- 二
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 十一
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
このように、百を持っていても大丈夫です。アイデアは非常に優れており、洞察に満ちていますが、残念ながら、コンパイルは失敗しました。 (たとえば、オブジェクトは卵の中の鶏のようなもので、属性は筋肉であり、メソッドは手羽先、鶏の足などです)、in
super.init
以前(卵が孵化する前)、メソッドはまた、初期化されていません(鶏は孵化していないので、手羽先を焼きますか?)
ナンセンスなことをたくさん話した後、それを解決する方法、心配しないでください、
class ViewController: UIViewController { let name: String // custom constructor init(_ coder: NSCoder? = nil) { name = 'Paul' if let coder = coder { super.init(coder: coder)! } else { super.init(nibName: nil, bundle:nil) } } required convenience init(coder: NSCoder) { self.init(coder) } // The following sentence can be omitted override convenience init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { self.init(nil) } }
- 1
- 二
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 十一
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
このように、カスタムコンストラクターにいます
init(_ coder: NSCoder? = nil)
オプションを追加しましたNSCoding
パラメーターはデフォルトでnilなので、以前のようにパラメーターなしで呼び出しますinit(nil)