0

我不确定我是否使用了错误的词汇来搜索这个,但我找不到任何似乎与我正在尝试做的事情有关的东西。

我有一门课是为了输入费用。我有 Name、amount 和 dueDate 成员变量。我正在使用命令行工具来创建这个类并对其进行测试。我的问题是,当用户需要增加费用时,我将如何从我的班级创建一个对象。这就是我为使其工作所做的工作。我不喜欢它。

我的 while 循环创建了我的类的一个新实例,然后获取用户输入,设置费用类的成员变量,最后将该对象添加到数组中以供以后使用。

一切正常我只是不喜欢每个对象基本上都具有相同的名称。我本来想根据用户输入的名称创建对象的名称,但我发现让用户输入类的名称并不好。所以请有任何建议。而且我对编程还很陌生,所以代码可能很乱。

    NSMutableArray *myExpenses = [[NSMutableArray alloc] init];

    while (enterMore == 1) 
    {
        Expense *anExpense = [[Expense alloc]init];

        NSLog(@"Enter an expense:\n\nName: ");
        scanf("%s", expenseName);
        billName = [NSString stringWithUTF8String: expenseName];
        anExpense.name = billName;

        NSLog(@"\nEnter the amount of the expense: ");
        scanf("%lf", &expenseAmount);
        anExpense.amount = expenseAmount;

        NSLog(@"\nEnter the day of the month the expense is due: ");
        scanf("%d", &dateDue);
        anExpense.dayOfMonthDue = dateDue;

        [myExpenses addObject:anExpense];

        NSLog(@"Enter 1 to enter more expenses anything else to quite: ");
        scanf("%d", &enterMore);

    }
for (int i = 0; i < [myExpenses count]; i++) 
{
    NSLog(@"%@", [[myExpenses objectAtIndex:i] name]);
    NSLog(@"%f", [[myExpenses objectAtIndex:i] amount]);
    NSLog(@"%d", [[myExpenses objectAtIndex:i] dayOfMonthDue]);
}
4

2 回答 2

1

为此,您可以将实例添加到字典对象 (NSMutableDictionary) 中,您可以使用该对象通过键 (NSString) 访问每个对象。这是一种方法。以下是有关字典的更多信息的参考:

http://www.techotopia.com/index.php/Objective-C_Dictionary_Objects

更新:要回答评论,我的意思是添加实例。字典对象是一个数组,它使用键而不是数字来访问对象。问题是,你不能动态地创建实例。无法访问,因为编译器不知道这些变量是否存在并且不会编译。这就是不允许的原因。您可以做的是使用字典对象。它更容易访问,因为如果用户输入费用名称,由于输入将是一个字符串,因此会更自动地找到它。

于 2012-06-25T00:38:43.563 回答
0

它在另一个答案中有所说明(所以我赞成那个),但也许一个例子会有所帮助。

NSMutableDictionary *myExpenses = [[NSMutableDictionary alloc] init];

while (enterMore == 1) 
{
    Expense *anExpense = [[Expense alloc] init];

    NSLog(@"Enter an expense:\n\nName: ");
    scanf("%s", expenseName);
    billName = [NSString stringWithUTF8String: expenseName];
    anExpense.name = billName;

    NSLog(@"\nEnter the amount of the expense: ");
    scanf("%lf", &expenseAmount);
    anExpense.amount = expenseAmount;

    NSLog(@"\nEnter the day of the month the expense is due: ");
    scanf("%d", &dateDue);
    anExpense.dayOfMonthDue = dateDue;

    [myExpenses setObject:anExpense forKey:billName];

    NSLog(@"Enter 1 to enter more expenses anything else to quite: ");
    scanf("%d", &enterMore);

}
NSArray * allValues = [myExpenses allValues];
for (int i = 0; i < [allValues count]; i++) 
{
    Expense * myExpense = [allValues objectAtIndex:i];
    NSLog(@"%@", [myExpense name]);
    NSLog(@"%f", [myExpense amount]);
    NSLog(@"%d", [myExpense dayOfMonthDue]);
}

真正的力量在于,现在您可以通过 name引用一个值。例如:

Expense * anExpense = [myExpenses objectForKey:@"Expense Name"];

希望这会有所帮助。

编辑:另外,我注意到你没有打电话-release-autorelease在你的实例上。您正在使用 ARC(自动参考计数),或者如果您仍在使用 MRR(手动保留释放),您应该自动释放您的费用。如果您使用 ARC,请不要介意这一点,但如果不是 - 您将有内存泄漏。或者您可以显式调用 release(请参阅:在将对象添加到集合之前使用 autorelease?

于 2012-06-25T05:02:36.143 回答