問題タブ [designated-initializer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - Swift で UIViewController の init メソッドを記述する方法
次の UIViewController クラスに init メソッドを追加できません。init メソッドにコードを記述する必要があります。init(coder) メソッドを書く必要がありますか? コーダーとデコーダーのメソッドを追加しても、まだエラーが発生します。また、パラメーターなしで init メソッドを使用しようとしましたが、それも機能していないようです。
パラメータなしで super.init() メソッドを呼び出すと、エラーは「スーパークラスの指定された初期化子を呼び出す必要があります」であり、パラメータ nib とバンドルを渡すと、エラーは「必要な初期化子 init(coder)」です。
init(coder) と init(decoder) を追加しても機能しません。
objective-c - Objective-Cでスーパークラスの指定されたイニシャライザを「無効」とマークする方法は?
Adapting Modern Objective-C ドキュメントから:
クラスが 1 つ以上の指定された初期化子を提供する場合、そのスーパークラスのすべての指定された初期化子を実装する必要があります。
つまりNSObject
、独自の指定された初期化子を持つサブクラスがある場合、たとえば
次に、 NSObjects の実装も提供する必要があります-init
。-init
イニシャライザを「無効」とマークするにはどうすればよい-initWithImage:
ですか? ここでのベストプラクティスは何ですか?
編集
ここで説明されている手法を試しました。
-init
ただし、インターフェイスでスーパークラスメソッドをマークするunavailable
と、コンパイラはスーパークラスの初期化子を上書きする必要があることを通知します。
他の手法、つまり、例外を発生させたり、-doesNotRecognizeSelector:
内部で呼び出したりしようと-init
すると、指定された初期化子の 1 つを呼び出す必要があることを示すエラーが表示されます。
swift - クラス階層の便利な初期化により無限再帰が発生する
Swift 2.0 には 2 つのクラスの階層があります。どちらのクラスも、引数を渡すか、引数[String: AnyObject]
を含む JSON 辞書 ( ) を渡すことでインスタンス化できます。
引数を直接受け取る initはでdesignated inits
、JSON を受け取る init は同じ署名です。convenience inits
convenience
initSubThing
は super で同じ init を呼び出すことは許可されていません。自分自身で呼び出すと、両方のメソッドのように無限再帰が発生しますhave the same signature
。
両方の json inits を作成するとdesignated
、 を呼び出すことができず、 の両方の初期化子で同じコードを繰り返さなければなりません。self.init(name:)
Thing
Thing
このような状況を回避する最善の方法は何ですか?
objective-c - 指定されたイニシャライザ、明確にしてください。
今、私はかなり長い間この問題に頭を悩ませていましたが、これを明確にしてくれる人が本当に必要です.
1) 指定された初期化メソッドは、サブクラス化された init メソッドによって呼び出されたときに、コンパイラによってどのように決定されますか? 一番カバー力があると言われています。
2) 複数の init メソッドでサブクラス化する場合、各クラスには独自の指定された初期化メソッドがありますか? 質問 2 への回答も、これを理解するのに役立ちます。
3) 複数のクラスが指定されたイニシャライザを持っている場合、他の init メソッドはどのようにそのクラスで指定されたイニシャライザを呼び出しますか? また、他の初期化子も呼び出さないのはなぜですか? なぜ指定されたイニシャライザ? それについて何が特別なのですか?
ios - 指定されたイニシャライザ?
apples docに記載されているように、これは何を言っているのですか:
場合によっては、スーパークラスの指定された初期化子がサブクラスにとって十分な場合があるため、サブクラスが独自の指定された初期化子を実装する必要はありません。また、クラスの指定された初期化子が、そのスーパークラスの指定された初期化子のオーバーライドされたバージョンである場合もあります。これは、サブクラスがそれ自身のインスタンス変数を追加しない (または追加するインスタンス変数が明示的な初期化を必要としない) にもかかわらず、スーパークラスの指定された初期化子によって実行される作業をサブクラスが補足する必要がある場合によくあります。
サブクラスの指定された初期化子を作成する必要はなく、スーパークラスの指定された初期化子で十分であると言っているのですか?そうであれば、サブクラスのプロパティはどのように初期化されますか? そして、これが許可された場合、どのシナリオで?それはどのように機能しますか?
また、DI をオーバーライドする場合、親クラスが同じ DI を持っているため、サブクラスからそのメソッドをどのように呼び出すことができますか? 仕事を補う必要があるとはどういう意味ですか?
ios - 指定された初期化子が呼び出されないのはなぜですか
ドキュメントによると、指定された初期化子は常に呼び出される必要がありますが、アクセス許可を持たずにユーザーの血液型を取得しようとすると、NSError
作成されますが、その指定された初期化子 ( - [NSError initWithDomain:code:userInfo:]
) は呼び出されません。
私が使用しているコードは次のとおりです。
Obs: 指定されたイニシャライザが呼び出されていないことはわかっています。他のメソッドのようなもの- [NSFileManager contentsOfDirectoryAtPath:error:]
は、期待どおりに動作します。
なぜそれが起こっているのですか?何か不足していますか?レーダーを開くべきですか?
objective-c - 新しい指定イニシャライザを作成するときに init をオーバーライドする必要がありますか?
指定イニシャライザと便利なイニシャライザについてかなり読んだことがありますobjective-c
が、それらがどのように、そしてなぜ使用されるのかをよく理解していると感じています。未解決の質問がいくつかありますが、それは本当に 1 つです。
から直接継承するクラスがあり、そのNSObject
ための指定された初期化子を作成するとします。
NS_DESIGNATED_INITIALIZERを使用して指定イニシャライザをマークできるようになりましたが、同じクラス内で、指定イニシャライザの呼び出しで最初に init をオーバーライドする必要があることを意味するのでしょうか?
次に、このマクロを使用しない場合、指定された初期化子の呼び出しで init を明示的にオーバーライドしないと、どのような影響があるでしょうか? コンパイラはどれが指定された初期化子であるかを認識しないので、これから何か悪いことが起こる可能性があります.クラスの新しい指定された初期化子を作成するときに init もオーバーライドすることをお勧めしますか?
編集:この質問についてさらに説明を加えたいと思います。優れたコーダーが、独自に作成した指定イニシャライザを追加したにもかかわらず、init をオーバーライドするための個別のメソッドを追加していない例を見てきました。init をオーバーライドする必要があるかどうかを尋ねるときは、もちろんそのスーパークラスの init メソッドを呼び出す必要がある独自の指定された初期化子を作成することに加えて、ということです。優れたコーダーがこれを行わないのを見たので、なぜそれを行うのか疑問に思いました.