どのイニシャライザを指定し、どれを便利なイニシャライザにするかを理解しようとしています。そのトピックに関するアップルのドキュメントを読みましたが、まだわかりません。指定された初期化子には、クラスに必要なすべての値が必要ですか? たとえば、
これは私が作成した最初の指定された初期化子でした
-(id)initWithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck
{
self = [super init];
if (self) {
for(int i = 0; i<=cardCount;i++){
Card *card = [deck drawRandomCard];
if (!card) {
self = nil;
break;
}else{
self.cards[i] = card;
}
}
}
return self;
}
ここcardMatchMode
で、このクラスにプロパティを追加し、初期化子で設定したいと考えています。クラスに下位互換性を持たせ、初期化子を理解するために、現在持っているものを保持し、別の初期化子を作成しています。
-(id)initwithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck cardMatchMode:(NSUInteger)matchMode
{
_cardMatchMode = matchMode;
return [self initWithCardCount:cardCount usingDeck:deck];;
}
Apple ドキュメントに基づいて、コンビニエンス イニシャライザは指定されたイニシャライザの値を返す必要がありますが、コンビニエンス イニシャライザでこのクラスに追加のプロパティを設定できますか? 私は言うことができますself.cardMatchMode = matchMode;
か、それとも自己はまだ完全に初期化されていませんか?
それは機能しますが、これが適切なコードであるかどうかを理解したかっただけで、便利な初期化で cardMatchMode プロパティにアクセスできるか、作成する必要があります
-(id)initwithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck cardMatchMode:(NSUInteger)matchMode
指定された初期化子として、もう 1 つの便利な初期化とコードのリワーク? ありがとう!
/////アップデート
でエラーが発生しました
-(id)initwithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck cardMatchMode:(NSUInteger)matchMode
私がやろうとしたときself = [self initWithCardCount:(NSUInteger)cardCount usingDeck:(Deck*)deck;
、initファミリーの外で自分自身を割り当てることはできないというエラーが表示されました。私は何が問題なのかを理解しました。init メソッドには小文字の w があり、大文字にする必要があったため、現在は機能しています。これは、便利な初期化子用に現在持っているコードです。
-(id)initWithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck cardMatchMode:(NSUInteger)matchMode
{
self = [self initWithCardCount:cardCount usingDeck:deck];
if (self){
_cardMatchMode = matchMode;
}
return self;
}
今、それはより理にかなっています。スーパーを呼び出す指定されたinitを呼び出してから、cardMatchMode
変数を設定しました。
私が理解している限り、追加のパラメーターを持つ便利なイニシャライザーを持つ多くのオブジェクトがあり、指定された init を呼び出すだけです。NSString を見て、異なるパラメーターを持つ異なる初期化子がある場合。おそらく、指定された初期化子である init を呼び出しています。これは正しいです?