我刚刚开始使用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.m
,drink.m
和drink.h
个文件。
答案 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
。