指定された名、姓、生年月日を使用して 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;