【问题标题】:Assign an object before it is created (ObjC)在创建对象之前分配对象(ObjC)
【发布时间】:2015-08-09 13:59:46
【问题描述】:

我刚刚开始使用 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 编译器是动态的吧?

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

【问题讨论】:

  • “因为 ObjC 编译器是动态的”——这是什么意思?除了另一个评估(margharita.similarDrinks = strawberryMargharita;)之外,这需要什么样的特殊“活力”?
  • 您可以在重写的 [Drink init] 方法中执行这些操作,就像在 Python 对象构造函数方法(以及几乎所有语言)中一样。
  • @TheParamagneticCroissant 我试过了,我得到了Use of undeclared identifier strawberryMargharita`
  • @trojanfoe 你介意给我看一下代码吗?谢谢
  • @user3056783 显然,您需要将分配移动到strawberryMargharita 已经存在的位置。例如,紧接在其他分配之后或之前。

标签: objective-c oop undeclared-identifier


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

【讨论】:

  • 我去看了一下。这不完全是我的想法,但我已经找到了解决方案。谢谢。
【解决方案2】:

将对象分配给已声明但未初始化的变量(相同类型)非常好。

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

例如代码

@property (strong) NSMutableArray *similarDrinks;

...

[similarDrinks addObject:strawberryMargharita];

会崩溃或者什么都不做,因为变量similarDrinksnil,此时strawberryMargharita将会被添加。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-15
    • 2018-10-01
    • 2013-03-22
    • 2013-09-09
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多