В настоящее время я преподаю себе Objective-C с руководством Big Nerd Ranch (2-е издание), и у меня не было проблемы до главы 21. Я проверил форум книги, но это не помогло, потому что у большинства людей есть новички с кодом спагетти, и я не хочу принимать вредные привычки ... Я тоже начинаю, поскольку это мой первый основной язык, но код спагетти очевиден, когда вы его видите.Попытка создать портфель акций с общей стоимостью в Objective-C, но не уверен в подходе
Мне нужно взять мой код из предыдущей главы и создать инструмент, который создает экземпляр класса BNRPortfolio и заполняет его запасами (также должен суммировать текущее значение портфеля). Затем мне нужно добавить свойство символа в BNRStockHolding, в котором символ символа запаса используется как NSString.
Я просто полностью смущен относительно того, где добавить код, чтобы сделать это и как начать. Из моих исследований в Интернете эта глава была плохо написана, и именно там большинство читателей застряли ... авторы даже согласились, что в будущих изданиях (если они когда-либо произойдут из Swift) они перепишут всю главу.
В настоящее время мой код из предыдущей главы выглядит следующим образом:
BNRStockHolding.h
#import <Foundation/Foundation.h>
@interface BNRStockHolding : NSObject
@property (nonatomic) float purchaseSharePrice;
@property (nonatomic) float currentSharePrice;
@property (nonatomic) int numberOfShares;
- (float)costInDollars;
- (float)valueInDollars;
@end
BNRStockholding.m
#import "BNRStockHolding.h"
@implementation BNRStockHolding
- (float)costInDollars
{
return _purchaseSharePrice * _numberOfShares;
}
- (float)valueInDollars
{
return _currentSharePrice * _numberOfShares;
}
@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 : BNRStockHolding
- (float)costInDollars
{
float foreignCostInDollars = super.costInDollars;
return _foreignCostInDollars * _conversionRate;
}
- (float)valueInDollars
{
float foreignValueInDollars = super.valueInDollars;
return _foreignValueInDollars * _conversionRate;
}
@end
Мой главный файл: main.m
#import <Foundation/Foundation.h>
#import "BNRForeignStockHolding.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
BNRStockHolding *stock0 = [[BNRStockHolding alloc]init];
BNRStockHolding *stock1 = [[BNRStockHolding alloc]init];
BNRStockHolding *stock2 = [[BNRStockHolding alloc]init];
BNRForeignStockHolding *stock3 = [[BNRForeignStockHolding alloc]init];
stock0.purchaseSharePrice=2.30;
stock0.currentSharePrice=4.50;
stock0.numberOfShares=40;
stock1.purchaseSharePrice=12.19;
stock1.currentSharePrice=10.56;
stock1.numberOfShares=90;
stock2.purchaseSharePrice=45.10;
stock2.currentSharePrice=49.51;
stock2.numberOfShares=210;
stock3.purchaseSharePrice=43.05;
stock3.currentSharePrice=28.31;
stock3.numberOfShares=15;
stock3.conversionRate=0.3;
NSMutableArray *stocks = [NSMutableArray arrayWithObjects:stock0, stock1, stock2, stock3, nil];
for (BNRForeignStockHolding *s in stocks) {
float a = s.purchaseSharePrice;
float b = s.currentSharePrice;
int c = s.numberOfShares;
if ([s isMemberOfClass:[BNRForeignStockHolding class]]) {
float d = s.foreignCostInDollars;
float e = s.foreignValueInDollars;
NSLog(@"\n Purchase Price: %.2f\n Current Price: %.2f\n Number of Shares %d\n Cost in Dollars %f\n Value in Dollars %f\n", a, b, c, d, e);
}
else {
float d = s.costInDollars;
float e = s.valueInDollars;
NSLog(@"\n Purchase Price: %.2f\n Current Price: %.2f\n Number of Shares %d\n Cost in Dollars %f\n Value in Dollars %f\n", a, b, c, d, e);
}
}
}
return 0;
}
Я попытался это:
В BNRStockHolding.h, я создал переменную экземпляра:
- (float)currentTotalValue
и BNRStockHolding.m, я реализовал это следующим образом:
-(float)currentTotalValue
{
return _currentTotalValue = _currentSharePrice * _numberOfShares;
}
Затем в основной .m, я добавил это к функции «для» в моем запасе:
float f = s.currentTotalValue;
Затем добавили% .2f @, f в мою распечатку NSLog.
Он работал отлично для этого предостережения, за исключением:
Он просто дал мне ценность каждой отдельной акции без конвертации иностранных акций. Я несколько понимаю, почему, но глава не объяснила подробно, как атаковать такую проблему, поэтому я полностью потерян.Я даже не мог попытаться добавить символ биржевого кода, потому что не был уверен, где его реализовать.
При суммировании общей стоимости моего портфеля вручную конвертированные иностранные значения включаются в общую сумму 17 774,895 долларов США. Имейте в виду, что эти запасы притворяются, равно как и коэффициент конверсии и т. Д.
Благодарим за помощь, будем благодарны!
EDIT ДОБАВИТЬ
Проблема решена, мне пришлось переписать мои BNRStock и BNRForeign .h и .m файлы с переопределением для costInDollars и valueInDollars, а также добавить исключение для NSLog распечатать отдельные результаты для каждого с помощью метода [NSString stringWithFormat:]. Затем я добавил код суммы, рекомендованный несколькими настройками, и все сработало хорошо. Я также добавил, что биржевые тикеры не представляют проблемы, указав символ в качестве указателя в моих файлах .h и .m, а затем включив их в команду [NSString stringWithFormat:] printout.
Shoutout to danH, заметив, что моя стоимостьInDollars и valueInDollars должны быть переопределены для работы как для классов BNRStock, так и для BNRForeign, поскольку это было основной проблемой моей программы.
Спасибо! Я попробую это очень скоро и вернусь к вам. Я решил, что мне, возможно, придется создать новый класс, но не был уверен. Еще раз спасибо, я ценю это! – Yistorian
Я добавил еще один связанный с этим вопрос, все еще работая с примером, который вы предоставили. Я думаю, что есть некоторые странные ошибки в моих заголовочных файлах и файлах реализации, но я не уверен, что. – Yistorian
Я не думаю, что вы должны добавить что-нибудь в заголовок. Проблема, с которой вы столкнулись, связана с кодом вызова. Не следует пытаться вызвать foreignValueInDollars. Нет такого понятия. Пункт упражнения заключается в том, что иностранный и отечественный фонды делают то же самое для вас, что говорит вам их стоимость в долларах, хотя используется более сложное уравнение, подкласс скрывает это для вас. – danh