Я пытаюсь понять, какой из них следует обозначать как инициализатор и какой один инициализатор удобства. Я читал документы яблока по этой теме, но я все еще не уверен. Должен ли назначенный инициализатор иметь все значения, которые требуются для класса? Например
Это был первым назначенным инициализатор, что я создалНазначенный инициализатор и инициализатор удобства в объективе-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;
}
Теперь ADDE cardMatchMode
свойства этого класса и хотел бы установить его в инициализаторе. Чтобы сделать класс обратно совместимым и понять инициализаторы, я сохраняю тот, который у меня есть, и создаю другой инициализатор.
-(id)initwithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck cardMatchMode:(NSUInteger)matchMode
{
_cardMatchMode = matchMode;
return [self initWithCardCount:cardCount usingDeck:deck];;
}
на основе яблочных документации удобство инициализатор должен возвращать значение для назначенного инициализаторе но вопрос может я установить дополнительное свойство этого класса в удобстве инициализаторе? Могу ли я сказать self.cardMatchMode = matchMode;
или сам еще не полностью инициализирован?
Это делает работу, но я просто хотел бы понять, если это правильный код, и я могу получить доступ к свойству cardMatchMode в удобстве инициализации или я должен был бы сделать -(id)initwithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck cardMatchMode:(NSUInteger)matchMode
в качестве назначенного инициализатора и другой один удобство инициализации и переделать код? Благодаря!
///// Update
Я получаю сообщение об ошибке в
-(id)initwithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck cardMatchMode:(NSUInteger)matchMode
Когда я попытался сделать self = [self initWithCardCount:(NSUInteger)cardCount usingDeck:(Deck*)deck;
ошибка говорит, что вы не можете назначить себя вне семьи инициализации. Я понял, в чем проблема. Метод 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, который вызывает super, а затем я установил переменную cardMatchMode
.
Насколько я понимаю, существует множество объектов, у которых есть инициализатор удобства с дополнительными параметрами, и он просто вызовет назначенный init. Если вы посмотрите на NSString и у него разные инициализаторы с разными параметрами. Вероятно, это вызов init, который является назначенным инициализатором. Это верно?
Вы слышали о конструкторе перегрузкой? Обозначенный инициализатор подобен тому, что в Java как реальный конструктор, который принимает большинство параметров. Затем 'удобный инициализатор' будет вызывать' назначенный инициализатор' для выполнения работы, т. Е. Вызывать 'super init'. –