どちらの初期化子を指定し、どの初期化子をどちらの初期化子にするかを理解しようとしています。私はそのトピックでリンゴのドキュメントを読むが、私はまだよく分からない。指定された初期化子はクラスに必要なすべての値を持っていなければなりませんか?例
これについて私はobjective-cの初期化子と便利初期化子を指定し、それらを適切に作成して結び付ける方法
-(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
プロパティをADDEたし、初期化子でそれを設定したいと思います。クラスの下位互換性を保ち、初期化子を理解するために、私は今持っているものを保持していて、別の初期化子を作成しています。
-(id)initwithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck cardMatchMode:(NSUInteger)matchMode
{
_cardMatchMode = matchMode;
return [self initWithCardCount:cardCount usingDeck:deck];;
}
リンゴのドキュメントに基づいて利便初期化子は、指定イニシャライザの値を返すために持っていますが、問題は、私はコンビニエンス初期化子で、このクラスに余分なプロパティを設定することができますか? self.cardMatchMode = matchMode;
と言うことはできますか、またはselfはまだ完全に初期化されていませんか?
それは作業を行いますが、私はただ、これは適切なコードであれば理解したかったと私はコンビニエンスINITにcardMatchModeプロパティにアクセスすることができますか私は指定イニシャライザと他の1つのコンビニエンスのinitとして -(id)initwithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck cardMatchMode:(NSUInteger)matchMode
をしなければならないでしょうし、コードを修正しますか?ありがとう!私はself = [self initWithCardCount:(NSUInteger)cardCount usingDeck:(Deck*)deck;
を実行しようとしましたときに
/////更新
私は
-(id)initwithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck cardMatchMode:(NSUInteger)matchMode
でエラーを取得したエラーは、初期化、家族外の自己を割り当てることができないと述べました。私はそれが何か問題であると考えました。 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を呼び出すでしょう。これは正しいです?
あなたは、コンストラクタのオーバーロードについて聞いたことがありますか?指定されたイニシャライザは、実際のコンストラクタとしてのJavaのようなもので、ほとんどのパラメータが必要です。そして、 'コンビネーションイニシャライザ'は '指定されたイニシャライザ'を呼び出して 'super init'を呼び出します。 –