Qml

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)