Holding Portfolio Challenge: Solution


#1

This solution includes checks for currency conversion as well as description methods. It is comment heavy (I comment the hell out of the challenges for my own retention).

ZGCStockHolding.h

//
//  ZGCStockHolding.h
//  ObjC_Classes_ZGCPortfolio_Stocks_Challenge
//
//  Created by EvilKernel on 10/12/14.
//  Copyright (c) 2014 Zerogravity. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface ZGCStockHolding : NSObject

// declaring properties
@property (nonatomic) float purchaseSharePrice;
@property (nonatomic) float currentSharePrice;
@property (nonatomic) int numberOfShares;
@property (nonatomic, copy) NSString *symbol;

// declaring methods
- (void)addToStocks:(NSMutableArray *)array; //add to array via method instead of in main()
- (float)costInDollars; // purchaseSharePrice * numberOfShares
- (float)valueInDollars; // currentSharePrice * numberOFShares

@end

ZGCStockHolding.m

//
//  ZGCStockHolding.m
//  ObjC_Classes_ZGCPortfolio_Stocks_Challenge
//
//  Created by EvilKernel on 10/12/14.
//  Copyright (c) 2014 Zerogravity. All rights reserved.
//

#import "ZGCStockHolding.h"


@implementation ZGCStockHolding

- (void)addToStocks:(NSMutableArray *)array
{
    [array addObject:self];
}

- (float)costInDollars
{
    return [self purchaseSharePrice] * [self numberOfShares];
}

- (float)valueInDollars
{
    return [self currentSharePrice] * [self numberOfShares];
}



@end

ZGCForeignStockHolding.h

//
//  ZGCForeignStockHolding.h
//  ObjC_Classes_ZGCPortfolio_Stocks_Challenge
//
//  Created by EvilKernel on 10/12/14.
//  Copyright (c) 2014 Zerogravity. All rights reserved.
//

#import "ZGCStockHolding.h"

@interface ZGCForeignStockHolding : ZGCStockHolding

@property (nonatomic) float conversionRate;  // only one property in this subclass

@end

ZGCForeignStockHolding.m

//
//  ZGCForeignStockHolding.m
//  ObjC_Classes_ZGCPortfolio_Stocks_Challenge
//
//  Created by EvilKernel on 10/12/14.
//  Copyright (c) 2014 Zerogravity. All rights reserved.
//

#import "ZGCForeignStockHolding.h"

@implementation ZGCForeignStockHolding

// overriding these methods to account for conversion of foreign stock in US dollars
- (float)costInDollars
{
    if (self.conversionRate) { // if conversionRate not nil, process subclass method, else revert to SuperClass method to avoid 0 values.
        float localCostInDollars = [super costInDollars];
        return localCostInDollars * self.conversionRate;
    }else{
        return [super costInDollars];
    }
}

- (float)valueInDollars
{
    if (self.conversionRate) {
        float localValueInDollars = [super valueInDollars];
        return localValueInDollars * self.conversionRate;
    }else{
        return [super valueInDollars];
    }
    
}

- (NSString *)description //overriding descriptipn method
{
    // pull Currency locale information
    NSLocale *userLocale = [NSLocale currentLocale];
    NSString *currencyCode = [userLocale objectForKey:NSLocaleCurrencyCode];
    NSString *currencySym = [userLocale objectForKey:NSLocaleCurrencySymbol];
    float cost = [self costInDollars];
    float value = [self valueInDollars];
    if ([currencySym isEqualTo:@"$"]) {
        self.conversionRate = 0;
        return [NSString stringWithFormat:@"You paid $%.2fUSD for %d shares of %@, now valued at $%.2fUSD", cost, [self numberOfShares], [self symbol], value];
    }else{
        
    NSString *conversionRateLog = [NSString stringWithFormat:@"Your conversion rate from %@ to USD: %.2f", currencyCode, self.conversionRate];
    return [NSString stringWithFormat:@"%@, You paid $%.2fUSD for %d shares of %@, now valued at $%.2fUSD", conversionRateLog, cost, [self numberOfShares], [self symbol], value];
    }
}
@end

ZGCPortfolio.h

//
//  ZGCPortfolio.h
//  ObjC_Classes_ZGCPortfolio_Stocks_Challenge
//
//  Created by EvilKernel on 10/13/14.
//  Copyright (c) 2014 Zerogravity. All rights reserved.
//

#import <Foundation/Foundation.h>

@class ZGCForeignStockHolding; // 

@interface ZGCPortfolio : NSObject


// declaring properties
@property (nonatomic, copy) NSMutableArray *holdings;

// declaring methods
- (float)totalValue;

@end

ZGCPortfolio.m

[code]
//
// ZGCPortfolio.m
// ObjC_Classes_ZGCPortfolio_Stocks_Challenge
//
// Created by EvilKernel on 10/13/14.
// Copyright © 2014 Zerogravity. All rights reserved.
//

#import “ZGCPortfolio.h”
#import “ZGCForeignStockHolding.h”

@implementation ZGCPortfolio

  • (float)totalValue
    {
    float sum = 0;
    for (ZGCForeignStockHolding *s in _holdings) {
    sum += [s valueInDollars];
    }
    return sum;
    }

  • (NSString )description //overriding description method
    {
    return [NSString stringWithFormat:@"\n\n
    *** Your Portfolio’s total worth is valued at $%.2fUSD ****\n\n", self.totalValue];

}
@end[/code]

main.m

[code]
//
// main.m
// ObjC_Classes_ZGCPortfolio_Stocks_Challenge
//
// Created by EvilKernel on 10/12/14.
// Copyright © 2014 Zerogravity. All rights reserved.
//

#import <Foundation/Foundation.h>

#import “ZGCForeignStockHolding.h”
#import “ZGCPortfolio.h”

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

@autoreleasepool {
    
    // Two US 'stock' instances
    
    ZGCStockHolding *stockUS1 = [[ZGCForeignStockHolding alloc] init];
    stockUS1.symbol = @"APPL";
    stockUS1.numberOfShares = 40;
    stockUS1.purchaseSharePrice = 2.30;
    stockUS1.currentSharePrice = 4.50;
    
    ZGCStockHolding *stockUS2 = [[ZGCForeignStockHolding alloc] init];
    stockUS2.symbol = @"BNNE";
    stockUS2.numberOfShares = 90;
    stockUS2.purchaseSharePrice = 12.19;
    stockUS2.currentSharePrice = 15.56;
    
    // Two Foreign stock instances
    
    ZGCForeignStockHolding *stockUK = [[ZGCForeignStockHolding alloc] init];
    stockUK.symbol = @"UKLN";
    stockUK.numberOfShares = 10;  // subclass can use variables from its SuperClass
    stockUK.purchaseSharePrice = 1.50;
    stockUK.currentSharePrice = 2.00;
    stockUK.conversionRate = 2.50; // new property via new subclass
    
    ZGCForeignStockHolding *stockCH = [[ZGCForeignStockHolding alloc] init];
    stockCH.symbol = @"CHPN";
    stockCH.numberOfShares = 10;  // subclass can use variables from its SuperClass
    stockCH.purchaseSharePrice = 1.50;
    stockCH.currentSharePrice = 2.00;
    stockCH.conversionRate = 4.50; // new property via new subclass
    
    // One Portfolio instance
    ZGCPortfolio *myPortfolio = [[ZGCPortfolio alloc] init];
    
    // set holdings for portfolio
    myPortfolio.holdings = [[NSMutableArray alloc] initWithObjects:stockUS1, stockUS2, stockUK, stockCH, nil];
    
    
    NSLog(@"%@", myPortfolio.holdings); //uses description method for ZCGForeignHolding object
    NSLog(@"%@", myPortfolio); //uses description method for portfolio

}
return 0;

}[/code]

[color=#008000]OUTPUT W/OUT CONVERSION*
2014-10-21 01:36:31.497 ObjC_Classes_ZGCPortfolio_Stocks_Challenge[41770:5265223] (
“You paid $92.00USD for 40 shares of APPL, now valued at $180.00USD”,
“You paid $1097.10USD for 90 shares of BNNE, now valued at $1400.40USD”,
“You paid $37.50USD for 10 shares of UKLN, now valued at $50.00USD”,
“You paid $67.50USD for 10 shares of CHPN, now valued at $90.00USD”
)
2014-10-21 01:36:31.498 ObjC_Classes_ZGCPortfolio_Stocks_Challenge[41770:5265223]

**** Your Portfolio’s total worth is valued at $1620.40USD ****

Program ended with exit code: 0[/color]

[color=#4000FF]***OUTPUT W/CONVERSION
2014-10-21 01:44:50.401 ObjC_Classes_ZGCPortfolio_Stocks_Challenge[41845:5326478] (
“Your conversion rate from USD to USD: 0.00, You paid $92.00USD for 40 shares of APPL, now valued at $180.00USD”,
“Your conversion rate from USD to USD: 0.00, You paid $1097.10USD for 90 shares of BNNE, now valued at $1400.40USD”,
“Your conversion rate from EUR to USD: 2.50, You paid $37.50USD for 10 shares of UKLN, now valued at $50.00USD”,
“Your conversion rate from EUR to USD: 4.50, You paid $67.50USD for 10 shares of CHPN, now valued at $90.00USD”
)
2014-10-21 01:44:50.402 ObjC_Classes_ZGCPortfolio_Stocks_Challenge[41845:5326478]

**** Your Portfolio’s total worth is valued at $1720.40USD ****

Program ended with exit code: 0
[/color]