我是一名Objective-C noob,通过一个教程,我想要更好地理解一个奇怪的障碍。
我正在循环制作一个股票对象组合,这些股票对象有50/50的机会成为“外国股票”或只是“股票” - 不同的是转换率属性。对象股票是一个超类,外国股票是股票的子类。
我想创建一个指针,翻转硬币来决定它是哪种类型,然后分配我需要的值。由于子类和超类都有像currentSharePrice这样的东西,为什么我不能在抛硬币之后设置它们呢?
这是我的主要评论:
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Declare portfolio and set the conversion rate
BNRPortfolio *mikesPortfolio = [[BNRPortfolio alloc] init];
NSUInteger globalConRate = 1.2;
// Array of ticker names - remove them as they are used
NSMutableArray *tickerNames = [[NSMutableArray alloc] init];
[tickerNames addObject:@"ibm"];
[tickerNames addObject:@"ppg"];
[tickerNames addObject:@"google"];
[tickerNames addObject:@"vrzn"];
[tickerNames addObject:@"apple"];
[tickerNames addObject:@"barq"];
// Create and add the stocks to the portfolio
for (int i = 0; i < 6; i++) {
id newStock;
// Coin flip to determine type
NSUInteger randomType = random() % 2;
if (randomType == 0) {
newStock = [[BNRStockHolding alloc] init];
} else {
newStock = [[BNRForeignStockHolding alloc] init];
newStock.conversionRate = globalConRate;
}
// Assign remaining values
newStock.purchaseSharePrice = 15 * (random() % i);
newStock.currentSharePrice = newStock.purchaseSharePrice * 1.4;
NSUInteger randomTickerValue = random() % [tickerNames count];
newStock.symbol = tickerNames[randomTickerValue];
[tickerNames removeObjectAtIndex:randomTickerValue];
[mikesPortfolio addHoldings:newStock];
}
}
else {}块内的行newStock.conversionRate ...给出了一个Xcode预编译错误,声明“找不到__strong id类型对象的属性” - 我猜是因为它无法判断newStock是否真的会我刚宣布的是什么?但是main.m末尾的assign语句显示了相同的行错误,就像newStock没有这些属性一样,即使BOTH类可以访问它们。
如何让newStock明白它肯定会是一个具有这些属性的类,但也可能具有与子类关联的转换率?
我试过了:
BNRStockHolding newStock; <-- starting with superclass
// Coin flip to determine type
NSUInteger randomType = random() % 2;
if (randomType == 0) {
newStock = [[BNRStockHolding alloc] init];
} else {
newStock = [[BNRForeignStockHolding alloc] init];
newStock.conversionRate = globalConRate;
}
这将使底线上的错误消失,但仍然无法在else {}块中的子类方法中进行编译。
我哪里出错了?
答案 0 :(得分:2)
(我假设这实际上是main.m
,而不是main.c
。)
您的主要错误是使用id
而不是类型。
id newStock;
这说明newStock
是某种对象,我不知道是什么。&#34;在ObjC中,id
可以发送任何消息,但它没有任何属性。所以你不能在它上面使用点符号。有很多方法(不要使用点符号),但更好的解决方案是使用类型:
BNRStockHolding *newStock = nil;
这会导致问题:
newStock = [[BNRForeignStockHolding alloc] init];
newStock.conversionRate = globalConRate;
您可以通过这种方式修复:
BNRForeignStockHolding *foreignStock = [[BNRForeignStockHolding alloc] init];
foreignStock.conversionRate = globalConRate;
newStock = foreignStock;
但是,如果唯一的东西是外国股票&#34;外国&#34;是它有转换率,我强烈建议不要在这里进行子类化。只是让所有股票都有转换率。如果是国内的,请将转换率设为1。