我正在阅读的书中的先前说明是为BNRItem类创建一个指定的初始化程序,本书引导我完成:
BNRItem.h
// Designated initializer for BNRItem
- (instancetype)initWithItemName:(NSString *)name
valueInDollars:(int)value
serialNumber:(NSString *)sNumber;
BNRItem.m
- (instancetype)initWithItemName:(NSString *)name
valueInDollars:(int)value
serialNumber:(NSString *)sNumber {
// Call the superclass's designated initializer
self = [super init];
// Did the superclass's designated initializer succeed?
if (self) {
// Give the instance variables initial values
_itemName = name;
_serialNumber = sNumber;
_valueInDollars = value;
// Set _dateCreated to the current date and time
_dateCreated = [[NSDate alloc] init];
}
// Return the address of the newly created initialized object
return self;
}
本书还解释了从BRNItem的超类继承的init方法以及如何覆盖该方法:
BNRItem.h
-(instancetype)init {
return [self initWithItemName:@""];
}
现在,我正在完成本章末尾的挑战,我感觉我正在使它变得比它需要的更复杂。挑战如下:
“为BNRItem类创建另一个初始化方法。这个初始化器不是BNRItem的指定初始化器。它使用一个NSString实例来标识项目的itemName和一个标识serialNumber的NSString实例。”
以下是我创建的代码:
BNRItem.h
// Another initializer
- (instancetype)initWithItemName:(NSString *)name
serialNumber:(NSString *)sNumber;
BNRItem.m
- (instancetype)initwithItemName:(NSString *)name
serialNumber:(NSString *)sNumber {
return [self initwithItemName:name
serialNumber:@""];
我的解决方案是否正确?
答案 0 :(得分:2)
请尝试这个,您可以在init方法中调用指定的初始化程序。
- (instancetype)initWithItemName:(NSString *)name
serialNumber:(NSString *)sNumber {
// call the Designated initializer here
return [self initWithItemName:name
valueInDollars:0 //It is a default value
serialNumber:sNumber];
}
答案 1 :(得分:2)
我们指定一个指定的初始化程序从超类扩展,所有其他的初始化程序调用此指定的初始化程序。指定初始化程序的目的是:
如果有意义,我们可以将指定的初始化程序设置为私有(通过从标头中删除它),并且只显示更简单的初始化程序。例如,当某些参数可能为零时,而不是让用户猜测这是否有效,我们可以为初始化程序提供该用法的参数。
所有未指定的初始化程序都将调用指定的初始化程序。指定的初始化程序应公开所有情况的可配置参数。