我不确定我是否使用错误的词汇来搜索这个,但我找不到任何与我想要做的事情有关的事情。
我有一个课程,我已经为进入费用。我有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]);
}
答案 0 :(得分:1)
您可以为此做的是将实例添加到字典对象(NSMutableDictionary),您可以使用键(NSString)访问每个对象。这是一种方法。以下是有关diccionaries的更多信息:
http://www.techotopia.com/index.php/Objective-C_Dictionary_Objects
更新:要回答评论,我的意思是添加实例。字典对象是一个数组,它使用键来访问对象而不是数字。问题是,你无法在动态创建实例。访问是不可能的,因为编译器不会知道这些变量是否存在且不会编译。这就是不允许的原因。你可以做的是使用字典对象。它更容易访问,因为如果用户输入费用名称,由于输入将是一个字符串,因此可以更自动地找到它。
答案 1 :(得分: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]);
}
现在,您可以通过名称引用值。例如:
Expense * anExpense = [myExpenses objectForKey:@"Expense Name"];
希望这有帮助。
编辑:另外,我注意到您没有在实例上调用-release
或-autorelease
。您要么使用ARC(自动参考计数),要么您仍在使用MRR(手动保留 - 释放),您应该自动释放您的费用。如果您使用ARC,请不要介意,但如果没有 - 您将有内存泄漏。或者您可以明确地调用release(参见:Use autorelease before adding objects to a collection?)