找不到实例方法(返回类型默认为'id'

时间:2014-04-09 21:42:23

标签: objective-c xcode

我在训练期间写了两个程序。但是一项锻炼任务让我发疯。不是任务本身,而是程序及其行为。

第一个计划是计算一个人的BMI。这里一切都很好。

的main.m

#import <Foundation/Foundation.h>
#import "Person.h"

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

@autoreleasepool {

    // Erstellt eine Instanz von Person
    Person *person = [[Person alloc]init];

    // Gibt den Instanzvariablen interessante Werte
    [person setWeightInKilos:93.2];
    [person setHeightInMeters:1.8];

    // Ruft die Methode bodyMassIndex auf
    float bmi = [person bodyMassIndex];
    NSLog(@"person (%dKg, %.2fm) has a BMI of %.2f", [person weightInKilos], 
[person heightInMeters], bmi);


}
return 0;
}

Person.h

@interface Person : NSObject
{
// Sie hat zwei Instanzvariablen
float heightInMeters;
int weightInKilos;
}

// Sie können diese Instanzvariablen anhand folgender Methoden setzen
@property float heightInMeters;
@property int weightInKilos;

// Diese Methode berechnet den Body-Mass-Index
- (float)bodyMassIndex;


@end

Person.m

#import "Person.h"

@implementation Person

@synthesize heightInMeters, weightInKilos;

- (float)bodyMassIndex
{
float h = [self heightInMeters];
return [self weightInKilos] / (h * h);
}
@end

该计划由培训作者撰写。

我的任务是编写一个相同的程序。 在我看来,它看起来完全一样:

的main.m

#import <Foundation/Foundation.h>
#import "StocksHolding.h"

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

@autoreleasepool {

    StocksHolding *stock1 = [[StocksHolding alloc]init];

    [stock1 purchaseSharePrice:1]; 
/*Here I geht the error "Instance method '-purchaseSharePrice:' not found (return type
defaults to 'id')*/
    NSLog(@"%i", [stock1 purchaseSharePrice]);

}
return 0;
}

StockHoldings.h

#import <Foundation/Foundation.h>

@interface StocksHolding : NSObject
{
int purchaseSharePrice;
float currentSharePrice;
int numberOfShares;
}
@property int purchaseSharePrice;
@property float currentSharePrice;
@property int numberOfShares;

- (float)costInDollars;
- (float)valueInDollars;


@end

StockHoldings.m

#import "StocksHolding.h"

@implementation StocksHolding
@synthesize purchaseSharePrice, currentSharePrice, numberOfShares;

- (float)costInDollars
{
return purchaseSharePrice * numberOfShares;
}
- (float)valueInDollars
{
return currentSharePrice * numberOfShares;
}


@end

您可以看到......除了变量和方法的名称之外几乎没有差异。 错误在哪里? 我在这个问题上坐了3个小时。

请帮助我。

由于 基督教

1 个答案:

答案 0 :(得分:1)

问题是您没有使用生成的setter方法。

purchaseSharePrice是一个属性。

默认设置器为setPurchaseSharePrice:,默认的getter为purchaseSharePrice

所以你可以这样做

[stock1 setPurchaseSharePrice:1];

或者

stock1.purchaseSharePrice = 1;

此外,当您想使用生成的getter获取值时,您可以

int myPrice = [stock1 purchaseSharePrice];

或者

int myPrice = stock1.purchaseSharePrice;

正如您在设置和获取中看到的那样,拥有一个属性允许您直接使用带有属性名称的点语法,而使用方法语法则要求您使用属性生成的方法名称。