在创建对象之前指定对象(ObjC)

时间:2015-08-09 13:59:46

标签: objective-c oop undeclared-identifier

我刚刚开始使用Obj-C。然而,由于我的背景是Python,我仍然很少有概念和语法。我确定ObjC有处理这个问题的机制(选择者?)但是我仍然没有那么远,我希望向你学习。

考虑这个课程:

@interface Drink : NSObject

@property NSString *drinkName;
@property NSDictionary *drinkIngredients;
@property (weak) Drink *similarDrinks;

@end

属性similarDrinks将链接到同一类型的其他对象(我打算做对象列表,但决定保持简单,因此复数)。

我的主文件包含此代码:

Drink *margharita = [[Drink alloc] init];
    margharita.drinkName = @"Margharita";
    margharita.drinkIngredients = @{
                                    @"Fresh Lime Juice" : @22,
                                    @"Contreau" : @30,
                                    @"Blanco Tequila" : @45,
                                    };

然后有更多像这样的对象,最后我创建了strawberryMargharita对象:

Drink *strawberryMargharita = [[Drink alloc] init];
strawberryMargharita.drinkName = @"Strawberry Margharita";
strawberryMargharita.drinkIngredients = @{
                                          @"Fresh Lime Juice" : @20,
                                          @"Contreau" : @30,
                                          @"Blanco Tequila" : @45,
                                          @"Strawberry Puree" : @40
                                          };
strawberryMargharita.similarDrinks = margharita;

注意这里有效的属性strawberryMargharita.similarDrinks = margharita;,因为它是先前定义的。如果对象margharita可以指向此对象,那将会很好 - > margharita = strawberryMargharita.similarDrinks;。我认为这应该是可能的,因为ObjC编译器是动态的吗?

也有些人可能会指出我的数据结构并不完全适合这种情况,也许还有其他聪明的方法来实现这一点,但我想知道如何这样做,因为我和#39; d想学习如何分配未声明的对象。整个Xcode项目位于Github,其中包含main.mdrink.mdrink.h个文件。

2 个答案:

答案 0 :(得分:1)

我怀疑你需要为每个特定的饮料派生一个子类,并在子类init方法中初始化它的名称和成分:

StarberryMargharitaDrink.h:

#import "Drink.h"

@interface StrawberryMargharitaDrink : Drink
@end

StrawberryMargharitaDrink.m:

#import "StawberryMargharitaDrink.h"

- (instancetype)init
{
    self = [super init];
    if (self) {
        drinkName = @"Strawberry Margharita";
        drinkIngredients = @{
            @"Fresh Lime Juice" : @20,
            @"Contreau" : @30,
            @"Blanco Tequila" : @45,
            @"Strawberry Puree" : @40
        };
    }
    return self;
}

然后你可以明确地实例化每一种饮料:

Drink *drink = [StrawberryMargharitaDrink new];

但是我不确定如何实现similarDrink功能,而不是进一步子类Drink -> Margharita -> StrawberryMargharita

我可能会为每个相似的饮品定义一个enum DrinkClass项目,然后在init方法中分配该项目。

然而,总的来说,定义所有这些类型可能会很乏味,最好在字典中定义所有饮料,并根据此结构中的叶字典实例化Drink实例。这将更容易维护,并且需要创建更少的文件。

答案 1 :(得分:0)

将一个对象分配给声明但未初始化的变量 - 相同类型 - 完全没问题。

您不能做的是将对象添加到未初始化的集合变量。

例如代码

@property (strong) NSMutableArray *similarDrinks;

...

[similarDrinks addObject:strawberryMargharita];

会崩溃或者什么也不做,因为similarDrinks变量nil目前会添加strawberryMargharita