問題タブ [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.

0 投票する
1 に答える
480 参照

objective-c - Swift クラスの指定された初期化子でインスタンス メソッドを呼び出す

Swift プログラミング言語では、

「指定された初期化子は、スーパークラスの初期化子に委任する前に、そのクラスによって導入されたすべてのプロパティが初期化されていることを確認する必要があります。」別の S/O からの引用元

そうしないと、次のようなエラーが表示されます。

プロパティ 'self.baz' が super.init 呼び出しで初期化されていません

Swift で次の Objective-C コードを実装したいと思います。

次の実装では、上記のようにコンパイラ エラーがスローされます。

そして、次のことを行うと、次のエラーが表示されます

super.init が自己を初期化する前に、メソッド呼び出し 'parseString' で自己を使用する

したがって、現在の私の解決策は、プライベート クラス メソッドを使用することです。

私の質問は、同じことを達成するためのより良い方法があるか、それともプライベート クラス メソッドが最善のアプローチであるかということです。

0 投票する
1 に答える
607 参照

swift - SKShapeNode のサブクラスがその便利な初期化子の 1 つを使用することは可能ですか?

追加のプロパティを追加したいので、SKShapeNode から継承するクラスがあります。私が抱えている問題は、SKShapeNode の「便利な」初期化子を使用して「円」を作成できるようにしたいということですSKShapeNode.init(circleOfRadius:CGFloat)が、これは便利な初期化子であるため、コンパイラは「クラス SKShapeNode の指定された初期化子を呼び出す必要があります」というメッセージで不平を言います。 、親クラスの「指定された初期化子」の呼び出しのみを許可するためですが、SKShapeNode の唯一の「指定された」初期化子はSKShapeNode.init()、私が望む円の形状を作成しません。以下は、コンパイラ エラーのある私のコードです。問題は、SKShapeNode をサブクラス化しても、何らかの形で「利便性」にアクセスできるかどうかです。円の形で初期化するイニシャライザ? それは不可能だと私には思えます。それで、回避策はありますか?

ありがとう

ここに画像の説明を入力

0 投票する
2 に答える
632 参照

c - 指定された初期化子の誤動作について警告を受ける方法はありますか?

C99 では、構造体の指定された初期化子の概念が導入されました。たとえば、次のようになります。

私は次のように初期化することができX foo = {.a = '\1', .b = 2.0F, .c = 4};、呼び出し:printf("c = %d\na = %hhu\nb = %f", foo.c, foo.a, foo.b);は出力します:

c = 4
a = 1
b = 2.000000

ここで述べたように、これには、指定された初期化子の順序とは無関係に、cthen athenに割り当てるという「驚くべき動作」があります。b

次のような関数がある場合、これは実際の問題になります。

そして、私は次のように初期化したいと思いX foo = {.a = (char)f(), .b = g(), .c = h()};ますprintf("c = %d\na = %hhu\nb = %f", foo.c, foo.a, foo.b);:

c = 4
a = 5
b = 7.000000

私の初期化順序が尊重されていないという警告がないという問題がありました。これに対して有効にできる警告または何かがありますか?

実例

0 投票する
2 に答える
1157 参照

c - ヒープで指定された初期化子を使用する

designated initializers以下に示すように (「billy」の場合) 問題なく使用できますが、動的メモリで同じ初期化アプローチを使用すると、コンパイル時に問題が発生します。

指定イニシャライザの使用に関する制限は何ですか?

書き込み先 (つまりアドレス)以外、これら 2 つの初期化の違いは何ですか? 動的メモリで指定イニシャライザを使用できないのはなぜですか?


0 投票する
2 に答える
257 参照

c - マクロを介して 2 つの指定された初期化子を組み合わせる

組み込みプロジェクトで、構造体を初期化するためのマクロを提供するライブラリを使用しています。これにより妥当なデフォルトが提供されますが、デフォルトは他のパラメータに依存します。後で値を初期化するとオーバーヘッドが発生するため、この指定された初期化子の 1 つ以上の値をオーバーライドしたいと考えています。

理想的には、サード パーティのコードを管理する必要があるため、すべてのマクロをコピー アンド ペーストしたくありません。ライブラリがデフォルトを変更した場合、私もそれをしたくありません。

指定された初期化子を組み合わせたりオーバーライドしたりする方法があるので、オーバーヘッドはありませんか? コードは C99 に準拠し、移植可能でなければなりません。

問題を示すサンプル コード:

0 投票する
1 に答える
755 参照

swift - 指定されたイニシャライザでプロトコル拡張イニシャライザを呼び出す方法は?

既存のクラスの指定された初期化子にプロトコル拡張初期化子を挿入しようとしています。クラスから指定された初期化子をオーバーライドせずにそれを回避する方法はないと思います。次に、プロトコル拡張初期化子を呼び出します。

UIViewController以下は、特にクラスで試していることです。

フレームワークの既存の初期化プロセス中に自動的に呼び出されるように、プロトコル拡張初期化子を利用する方法はありますか?

0 投票する
1 に答える
563 参照

c - 構造体で 2D char 配列初期化子を初期化するために指定された初期化子を使用すると、VS2013 でエラー C2078 が発生する

私はVS2013を使用しています。プログラム全体は C++ ではなく C です。

このような「文字列の配列」を問題なく初期化できます。

次のように宣言された構造体があります。

次のように構造体を初期化しようとすると:

「エラー C2078: 初期化子が多すぎます」というメッセージが表示されます。これは、配列の初期化が.titles = { ...原因です。行を削除すると、エラーはなくなります。このエラーが発生するのはなぜですか? 構造体初期化子内でこのタイプの文字列初期化を達成する別の方法はありますか?

構造体の宣言を次のように変更すると

エラーはなくなります。ただし、これは私が変更できるものではありません。コード ベースの他の部分では、この構造体のサイズが正確に 400 バイトである必要があります。

strcpyさらに、各フィールドに入力するために使用できることはよく知っていますが、それは私の質問には答えません。

0 投票する
1 に答える
486 参照

ios - self が NIB から読み込まれている場合でも UIView initWithFrame を呼び出しますか?

私はコードベースを継承し、コンパイラがこのコードについて不平を言っているのを見つけました:

XCode は、スーパー クラスで指定されたイニシャライザが呼び出されていないと文句を言います。スーパーへの呼び出しのコメントを外すと、エラーは明らかに消えます。しかし、アプリケーションはかなりの数の iOS バージョンで行が欠落していることを気にしなかったので、これがむしろ学術的な要件なのか、それともこの場合は間違っているのかさえわかりません.

loadNibNamedメソッドは a で呼び出され、self上書きされますself。これにより、すぐに目に見えない問題が発生する可能性がありますか?

このような場合の適切な実装は何ですか?

0 投票する
1 に答える
4672 参照

swift - 必須イニシャライザと指定イニシャライザの違いは何ですか?

独自のカスタム tableViewCell を作成していたところ、次のエラーが表示されました。

「必要な」初期化子「init(coder:)」は、「UITableViewCell」のサブクラスによって提供される必要があります

私はそれを調べましたが、明らかにそれも実装する必要があります。しかし、これにより、必要な初期化子と指定された初期化子について混乱が生じました

アップルのドキュメントは次のように述べています。

必要な初期化子:

クラス初期化子の定義の前に必要な修飾子を記述して、クラスのすべてのサブクラスがその初期化子を実装する必要があることを示します。

指定された初期化子

指定された初期化子は、クラスの主要な初期化子です。指定されたイニシャライザは、そのクラスによって導入されたすべてのプロパティを完全に初期化し、適切なスーパークラス イニシャライザを呼び出して、スーパークラス チェーンの初期化プロセスを続行します。

次の記述は正しいですか。

  • 必須イニシャライザは常に指定イニシャライザです
  • 指定されたすべての初期化子が必須の初期化子であるとは限りません
  • クラスは必要な初期化子を 1 つしか持つことができませんが、指定された初期化子を複数持つことができますか?

そうは言っても、私はまだそれらの機能の違いを完全には理解していません。