In addition to what was requested in the challenge, I wanted a way to reference stock name. Also wanted an addToArray accessor as illustrated in the chapter. It took a bit of fiddling with the syntax due to unfamiliarity with the use of non primitive types declarations but the compiler helped. it seems to work…
Declarations .h
//
// ZGStockHolding.h
// ObjC_CLASSES_Stocks_Challenge
//
// Created by EvilKernel on 9/25/14.
// Copyright (c) 2014 Zerogravity. All rights reserved.
//
// ZGStockHolding CLASS
#import <Foundation/Foundation.h>
@interface ZGStockHolding : NSObject
{
// Instance variables
float _purchaseSharePrice;
float _currentSharePrice;
int _numberOfShares;
NSString *_shareName;
}
// Methods / accessors declarations
// setter and getter accessors
- (float)purchaseSharePrice;
- (void)setPurchaseSharePrice:(float)pp;
- (float)currentSharePrice;
- (void)setCurrentSharePrice:(float)cp;
- (int)numberOfShares;
- (void)setNumberOfShares:(int)n;
- (NSString *)shareName;
- (void)setShareName:(NSString *)name;
- (void)addToStocks:(NSMutableArray *)array; //accesor to add to array via method instead of in main()
// getter cost and value accessors
- (float)costInDollars; // purchaseSharePrice * numberOfShares
- (float)valueInDollars; // currentSharePrice * numberOFShares
@end
implementation .m
//
// ZGStockHolding.m
// ObjC_CLASSES_Stocks_Challenge
//
// Created by EvilKernel on 9/25/14.
// Copyright (c) 2014 Zerogravity. All rights reserved.
//
#import "ZGStockHolding.h" // import declarations
// implement accessors / methods
@implementation ZGStockHolding
- (float)purchaseSharePrice
{
return _purchaseSharePrice;
}
- (void)setPurchaseSharePrice:(float)pp;
{
_purchaseSharePrice = pp;
}
- (float)currentSharePrice;
{
return _currentSharePrice;
}
- (void)setCurrentSharePrice:(float)cp
{
_currentSharePrice = cp;
}
- (int)numberOfShares;
{
return _numberOfShares;
}
- (void)setNumberOfShares:(int)n
{
_numberOfShares = n;
}
- (NSString *)shareName
{
return _shareName;
}
- (void)setShareName:(NSString *)name;
{
_shareName = name;
}
- (void)addToStocks:(NSMutableArray *)array
{
[array addObject:self];
}
- (float)costInDollars;
{
return [self purchaseSharePrice] * [self numberOfShares]; // using self instead of explicit _variables
}
- (float)valueInDollars;
{
return [self currentSharePrice] * [self numberOfShares]; // using self instead of actual _variables
}
@end
main.m
//
// main.m
// ObjC_CLASSES_Stocks_Challenge
//
// Created by EvilKernel on 9/25/14.
// Copyright (c) 2014 Zerogravity. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "ZGStockHolding.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// Three 'stock' instances
ZGStockHolding *stockA = [[ZGStockHolding alloc] init];
[stockA setShareName:@"stockA"];
[stockA setNumberOfShares:40];
[stockA setPurchaseSharePrice:2.30];
[stockA setCurrentSharePrice:4.50];
ZGStockHolding *stockB = [[ZGStockHolding alloc] init];
[stockB setShareName:@"stockB"];
[stockB setNumberOfShares:90];
[stockB setPurchaseSharePrice:12.19];
[stockB setCurrentSharePrice:10.56];
ZGStockHolding *stockC = [[ZGStockHolding alloc] init];
[stockC setShareName:@"stockC"];
[stockC setNumberOfShares:210];
[stockC setPurchaseSharePrice:45.10];
[stockC setCurrentSharePrice:49.51];
// added a method/accessor to the CLASS as experiment (addToStock), which uses 'self' to add the object to an array
// via the method instead of explicitely in main()
NSMutableArray *stocks = [[NSMutableArray alloc] init];
[stockA addToStocks:stocks];
[stockB addToStocks:stocks];
[stockC addToStocks:stocks];
// Populating array
// NSMutableArray *stocks = [NSMutableArray array];
// [stocks addObject:stockA];
// [stocks addObject:stockB];
// [stocks addObject:stockC];
// Iterate over array
for (ZGStockHolding *s in stocks) { // using fast enum loop for arrays
float cost = [s costInDollars];
float value = [s valueInDollars];
NSLog(@"You paid %.2f for %d shares of %@, now valued at %.2f", cost, [s numberOfShares], [s shareName], value);
}
}
return 0;
}