在Objective-C中创建初始化程序

时间:2014-06-26 01:17:24

标签: ios objective-c

我正在阅读的书中的先前说明是为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实例。”

摘录自:Joe Conway。 “iOS编程。”iBooks。 https://itun.es/us/Zni-W.l

以下是我创建的代码:

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:@""];

我的解决方案是否正确?

2 个答案:

答案 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)

我们指定一个指定的初始化程序从超类扩展,所有其他的初始化程序调用此指定的初始化程序。指定初始化程序的目的是:

  • 确保创建后的课程。
  • 避免重复代码。我们有一个执行配置的初始化程序,其他人通过传递参数来调用这个。

如果有意义,我们可以将指定的初始化程序设置为私有(通过从标头中删除它),并且只显示更简单的初始化程序。例如,当某些参数可能为零时,而不是让用户猜测这是否有效,我们可以为初始化程序提供该用法的参数。

所有未指定的初始化程序都将调用指定的初始化程序。指定的初始化程序应公开所有情况的可配置参数。