2015-08-09 82 views
0

我刚刚开始使用Obj-C。然而,由于我的背景是Python,我仍然为了一些概念和语法而苦苦挣扎。我确定ObjC有机制来处理这个(选择器?),但我还没有那么远,我希望向你学习。在创建对象之前分配对象(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编译器是动态的吗?

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

+0

“因为ObjC编译器是动态的” - 你是什么意思?除了另一项补贴之外,还需要什么样的特殊“活力”(“margharita.similarDrinks = strawberryMargharita;')? –

+0

你会在覆盖的[Drink init]方法中做这些事情,就像在Python对象构造函数方法中(以及几乎所有的语言)一样。 – trojanfoe

+0

@TheParamagneticCroissant我试过了,我得到'使用未声明的标识符'strawberryMargharita' – user3056783

回答

0

将对象分配给已声明但未初始化的变量 - 属于同一类型 - 非常好。

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

例如代码

@property (strong) NSMutableArray *similarDrinks; 

... 

[similarDrinks addObject:strawberryMargharita]; 

会崩溃或者只是什么也不做,因为变量similarDrinksnil目前strawberryMargharita将被添加。

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实例。这将更容易维护,并且需要创建更少的文件。

+0

我去看看它。这并不是我想到的,但我已经找到了解决方案。谢谢。 – user3056783