2015-08-09 79 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