Назначенный инициализатор - это тот, который должны вызывать все остальные инициализаторы.UIView
и подклассы немного необычны тем, что у них фактически есть два таких инициализатора: -initWithFrame:
и -initWithCoder:
, в зависимости от того, как создается представление.Вам следует переопределить -initWithFrame:
, если вы создаете экземпляр представления в коде, и -initWithCoder:
, если вы загружаете его из пера.Или вы можете поместить свой код в третий метод и переопределить оба этих инициализатора так, чтобы они вызывали ваш третий метод.Фактически, это часто рекомендуемая стратегия.
Так, например, вы можете создать подкласс UIView, ClueCharacter
, который имеет собственный метод инициализации: -initWithPerson:place:thing:
.Затем вы создаете свой вид следующим образом:
Obj-C:
ClueCharacter *mustard = [[ClueCharacter alloc] initWithPerson:@"Col. Mustard"
place:kInTheStudy
thing:kTheRope];
Swift:
var mustard = ClueCharacter("Col. Mustard", place: kInTheStudy, thing: kTheRope)
Это хорошо, но для инициализацииUIView часть объекта, ваш метод должен вызвать указанный инициализатор:
Obj-C:
-(id)initWithPerson:(NSString*)name place:(CluePlace)place thing:(ClueWeapon)thing
{
if ((self = [super initWithFrame:CGRectMake(0, 0, 150, 200)])) {
// your init stuff here
}
}
Swift:
func init(name: String, place : CluePlace, thing : ClueWeapon)
{
if (self = super.init(CGRectMake(0, 0, 150, 200))) {
// your init stuff here
}
}
Если вы хотите вызвать инициализатор вашего подкласса -init
, это нормально, пока вы вызываете -initWithFrame:
в реализации.