声明并实现一个新的指定初始化器,用于使用指定的名字、姓氏和出生日期创建 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;
}
然后
...以及合适的类工厂方法。
工厂方法是一种产生对象实例的类方法。最常见的实现是让它分配和初始化对象的新实例并返回它。
//.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];
}
最后
不要忘记重写 init 以调用指定的初始化程序。
由于您设计的初始化程序是initWithNameAndDob:last:birth:
您的init
实现必须调用它。设计的初始化器的参数必须是合理的默认值,在这种情况下nil
很好。
-(id)init {
return [self initWithNameAndDob:nil last:nil birth:nil];
}
最后,我想指出您对初始化程序的命名约定并不是那么好。一个更合适和可读的将是
-(id)initWithFirstName:(NSString *)fName lastName:(NSString *)lName dateOfBirth:(NSDate *) dob;