Main.m
#import <Foundation/Foundation.h>
#import "BNRStockHolding.h"
#import "BNRForeignStockHolding.h"
#import "BNRPortfolio.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
BNRPortfolio *myStockPortfolio = [[BNRPortfolio alloc]init];
BNRStockHolding *stockTXRH = [[BNRStockHolding alloc]init];
BNRStockHolding *stockGSAT = [[BNRStockHolding alloc]init];
BNRStockHolding *stockAAPL = [[BNRStockHolding alloc]init];
// Made this stock foreign, although not really foreign
BNRForeignStockHolding *stockZNGA = [[BNRForeignStockHolding alloc]init];
/*******************************************************************/
stockTXRH.companyName = (@"Texas Roadhouse");
stockTXRH.symbol = @"TXRH";
stockTXRH.purchaseSharePrice = 26.62;
stockTXRH.currentSharePrice = 28.31;
stockTXRH.numberOfShares = 2556;
[myStockPortfolio addStock:stockTXRH];
/*******************************************************************/
stockGSAT.companyName = (@"GlobalStar");
stockGSAT.symbol = @"GSAT";
stockGSAT.purchaseSharePrice = 2.30;
stockGSAT.currentSharePrice = 4.50;
stockGSAT.numberOfShares = 40;
[myStockPortfolio addStock:stockGSAT];
/*******************************************************************/
stockAAPL.companyName = (@"Apple");
stockAAPL.symbol = @"AAPL";
stockAAPL.purchaseSharePrice = 10.50;
stockAAPL.currentSharePrice = 99.62;
stockAAPL.numberOfShares = 500;
[myStockPortfolio addStock:stockAAPL];
/*******************************************************************/
// Made this stock foreign, although not really foreign
stockZNGA.companyName = (@"Zynga");
stockZNGA.symbol = @"ZNGA";
stockZNGA.purchaseSharePrice = 2.30;
stockZNGA.currentSharePrice = 4.50;
stockZNGA.numberOfShares = 40;
stockZNGA.conversionRate = 0.94;
[myStockPortfolio addStock:stockZNGA];
// Displays information for each stock in your portfolio.
// Also displays the current value of the portfolio
// Put a break here and step into for each line to test
NSLog(@"%@", myStockPortfolio);
[myStockPortfolio removeStock:stockTXRH];
// Show the portfolio info again to see if stock is removed
NSLog(@"%@", myStockPortfolio);
// Remove stock
[myStockPortfolio removeStock:stockGSAT];
// Check portfolio again
NSLog(@"%@", myStockPortfolio);
// Remove stock
[myStockPortfolio removeStock:stockAAPL];
// Check portfolio again
NSLog(@"%@", myStockPortfolio);
// Remove stock
[myStockPortfolio removeStock:stockZNGA];
NSLog(@"%@", myStockPortfolio);
}
return 0;
}
BNRPortfolio.h
#import <Foundation/Foundation.h>
@class BNRStockHolding;
@interface BNRPortfolio : NSObject
- (float) valueOfPortfolio;
- (void) addStock:(BNRStockHolding *)stock;
- (void) removeStock:(BNRStockHolding *)stock;
@end
BNRPortfolio.m
#import "BNRPortfolio.h"
#import "BNRStockHolding.h"
#import "BNRForeignStockHolding.h"
// Class Extension
@interface BNRPortfolio ()
// Property is private. Visible only within implementation file.
@property (nonatomic) NSMutableArray *holdings;
@end
@implementation BNRPortfolio
// Add stocks to the portfolio
- (void) addStock:(BNRStockHolding *)stock
{
if (self.holdings == nil)
{
self.holdings = [[NSMutableArray alloc]init];
}
[self.holdings addObject:stock];
}
- (void) removeStock:(BNRStockHolding *) stock
{
[self.holdings removeObject:stock];
}
- (float) valueOfPortfolio
{
float sum = 0;
for (BNRStockHolding *stock in self.holdings)
{
sum += [stock valueInDollars];
}
return sum;
}
- (NSString *) description
{
NSLog(@"\nPortfolio Information:");
for (BNRStockHolding *stock in self.holdings)
{
// Displays the custom descriptions for both
// BNRStockHolding and BNRForeignStockholding
NSLog(@"%@", stock);
}
return [NSString stringWithFormat:@"\nThe current value of your portfolio is: $%.2f", [self valueOfPortfolio]];
}
@end
BNRStockHolding.h
#import <Foundation/Foundation.h>
@interface BNRStockHolding : NSObject
@property (nonatomic) NSString *companyName;
@property (nonatomic) NSString *symbol;
@property (nonatomic) float purchaseSharePrice;
@property (nonatomic) float currentSharePrice;
@property (nonatomic) int numberOfShares;
- (float) costInDollars; // purchaseSharePrice * numberOfShares
- (float) valueInDollars; // currentSharePrice * numberOfShares
@end
BNRStockHolding.m
#import "BNRStockHolding.h"
@implementation BNRStockHolding
- (float) costInDollars
{
return self.purchaseSharePrice * self.numberOfShares;
}
- (float) valueInDollars
{
return self.currentSharePrice * self.numberOfShares;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"\n\n Company Name: %@\n Stock Symbol: %@\n Number of Shares: %d\nPurchase Share Price: %.2f\n Current Share Price: %.2f\n Cost In Dollars: %.2f\n Value in Dollars: %.2f\n",
self.companyName, self.symbol, self.numberOfShares,
self.purchaseSharePrice, self.currentSharePrice,
[self costInDollars], [self valueInDollars]];
}
@end
BNRForeignStockHolding.h
#import <Foundation/Foundation.h>
#import "BNRStockHolding.h"
@interface BNRForeignStockHolding : BNRStockHolding
@property (nonatomic) float conversionRate;
@end
BNRForeignStockHolding.m
#import "BNRForeignStockHolding.h"
@implementation BNRForeignStockHolding
- (float) costInDollars
{
return (self.purchaseSharePrice * self.conversionRate) * self.numberOfShares;
}
- (float) valueInDollars
{
return (self.currentSharePrice * self.conversionRate) * self.numberOfShares;
}
// Description is overriden
- (NSString *)description
{
return [NSString stringWithFormat:@"\n\n Company Name: %@\n Stock Symbol: %@\n Number of Shares: %d\nPurchase Share Price: %.2f\n Current Share Price: %.2f\n Cost In Dollars: %.2f\n Value in Dollars: %.2f\n Conversion Rate: %.2f\n",
self.companyName, self.symbol, self.numberOfShares,
(self.purchaseSharePrice * self.conversionRate) , (self.currentSharePrice * self.conversionRate),
[self costInDollars], [self valueInDollars], self.conversionRate];
}
@end