声明并实现一个新的指定初始值设定项,用于使用指定的名字、姓氏和出生日期创建 XYZPerson...
您的声明是正确的,但您的实现是递归的,因为它正在调用自身。做类似的事情
//.h
-(id)initWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob;
//.m
-(id)initWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *)dob{
if(self = [super init]) {
// use the parameters to do something, eg.
_fName = fName; // assuming you have an ivar called _fName
_lName = lName; // assuming you have an ivar called _lName
_dob = dob; // assuming you have an ivar called _dob
}
return self;
}
Then
...以及合适的类工厂方法。
工厂方法是生成对象实例的类方法。最常见的实现是让它分配和初始化对象的新实例并返回它。
//.h
+(instancetype)personWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob {
//.m
+(instancetype)personWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob {
return [[XYZPerson alloc] initWithNameAndDob:fName last:lName birth:dob];
}
Finally
不要忘记重写 init 来调用指定的初始值设定项。
由于您设计的初始化程序是initWithNameAndDob:last:birth:
your init
实现必须调用它。设计的初始值设定项的参数必须是合理的默认值,在本例中nil
很好。
-(id)init {
return [self initWithNameAndDob:nil last:nil birth:nil];
}
最后,我想指出您的初始化程序的命名约定并不是那么好。更合适和可读的一个是
-(id)initWithFirstName:(NSString *)fName lastName:(NSString *)lName dateOfBirth:(NSDate *) dob;