2015-08-09 3 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.m, drink.m и drink.h файлами.

+0

«поскольку компилятор ObjC динамичен» - что вы подразумеваете под этим? какой особый «динамизм» нуждается в этом отдельно от другого осмысления («margharita.similarDrinks = strawberryMargharita;')? –

+0

Вы бы сделали это в переопределенном методе '[Drink init '', как и в методе конструктора объектов Python (и почти на каждом языке). – trojanfoe

+0

@TheParamagneticCroissant Я пробовал это, и я получаю «Использование необъявленного идентификатора' strawberryMargharita' – user3056783

ответ

0

Назначение объекта объявленной, но не инициализированной переменной того же типа - отлично.

Нельзя добавлять объект к переменной коллекции, которая не инициализирована.

Например, код

@property (strong) NSMutableArray *similarDrinks; 

... 

[similarDrinks addObject:strawberryMargharita]; 

разобьет или просто ничего не делать, так как переменная similarDrinks является nil на данный момент 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

Смежные вопросы