# Challenge 17 Solution

#1

Challenge 17 Solution

To make things easier to read, I’ve put StockHolding.h and StockHolding.m on the same file: main.m

[code]#import <Foundation/Foundation.h>

//StockHolding.h
@interface StockHolding : NSObject
@property float purchaseSharePrice, currentSharePrice;
@property int numberOfShares;
-(float)costInDollars;
-(float)valueInDollars;
@end

//StockHolding.m
@implementation StockHolding
@synthesize numberOfShares, currentSharePrice, purchaseSharePrice;
-(float)costInDollars {
return numberOfSharespurchaseSharePrice;
}
-(float)valueInDollars {
return numberOfShares
currentSharePrice;
}
@end

//main.m
int main(int argc, const char * argv[])
{

``````@autoreleasepool {
StockHolding *stock1 = [StockHolding new];
StockHolding *stock2 = [StockHolding new];
StockHolding *stock3 = [StockHolding new];
stock1.purchaseSharePrice = 100;
stock1.currentSharePrice = 98;
stock1.numberOfShares = 10;
stock2.purchaseSharePrice = 10;
stock2.currentSharePrice = 9;
stock2.numberOfShares = 2;
stock3.purchaseSharePrice = 1000;
stock3.currentSharePrice = 980;
stock3.numberOfShares = 100;
NSMutableArray *array = [[NSMutableArray alloc]initWithObjects:stock1, stock2, stock3, nil];
int i=1;
for (StockHolding *sh in array) {
NSLog(@"Stock %i: Cost: \$%.2f Value: \$%.2f", i, sh.costInDollars, sh.valueInDollars);
i++;
}
}
return 0;
``````

}[/code]

This is the output:

2013-08-07 21:25:44.293 Challenge 17 Your First Class[876:303] Stock 1: Cost: \$1000.00 Value: \$980.00
2013-08-07 21:25:44.295 Challenge 17 Your First Class[876:303] Stock 2: Cost: \$20.00 Value: \$18.00
2013-08-07 21:25:44.296 Challenge 17 Your First Class[876:303] Stock 3: Cost: \$100000.00 Value: \$98000.00

#2

How does it advance through the array? I’m confused as to why it doesn’t just output the same array object repeatedly.

#3

Hello Fostermatt,

the following syntax you will find at the end of the program `(StockHolding *sh in array)` enumerates the array basically starting from array[0] to the end of the array. In order for it to properly deal with the objects in the array that were stored there using `NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:stock1, stock2, stock3, nil]` you need to know the type of objects in the array and since we know they are of class StockHolding, that class is then used to declare a new object *sh and with each enumeration the sh points to the stocks 1,2 and 3 in order. With each iteration and since sh has the address of the stock at iteration i you can use that object to implement a method declared in StockHolding.

Hope this helps.

Happy coding!

#4

My code was much longer, but it still works.

``````
#import <Foundation/Foundation.h>
#import "BNRStockHolding.h"
int main(int argc, const char * argv[])
{

@autoreleasepool {

//Create an instance of BNRStockHolding

BNRStockHolding *stock1 = [[BNRStockHolding alloc] init];
BNRStockHolding *stock2 = [[BNRStockHolding alloc] init];
BNRStockHolding *stock3 = [[BNRStockHolding alloc] init];
//Give instance variables values
[stock1 setPurchasePrice:20.98];
[stock1 setcurrentPrice:50.98];
[stock1 setNumberOfShares:2];

[stock2 setPurchasePrice:60.09];
[stock2 setcurrentPrice:70.98];
[stock2 setNumberOfShares:9];

[stock3 setPurchasePrice:2.98];
[stock3 setcurrentPrice:5.98];
[stock3 setNumberOfShares:12];

NSMutableArray *stockArray = [[NSMutableArray alloc]initWithObjects:stock1,stock2,stock3,nil];
for (BNRStockHolding *allStocks in stockArray){
// use getters
float p = [allStocks purchasePrice];
float c = [allStocks currentPrice];
float n = [allStocks numberOfShares];

//use methods
float cost = [allStocks costInDollars];
float value = [allStocks valueInDollars];

NSLog(@"\n\nThe purchase price was %.2f the current price is %.2f the number of shares bought were %.0f the total cost was %.2f and the current value is %.2f\n",p,c,n,cost,value);
}
}
return 0;
}

``````