0

我尝试编写自定义 setter 方法,但失败并显示错误消息"Type of property 'pValue' does not match type of accessor 'setPValue:'"。数组已成功传递,但我不明白错误消息。

我的 .h 文件:

@property (nonatomic, assign) double pValue;

- (double)getInverseCDFValue:(double)p;
- (void)setPValue:(NSArray*)aArray;

我的实现:

@synthesize pValue;

- (void)setPValue:(NSArray *)aArray {

double p = [[aArray objectAtIndex:22]doubleValue];
NSLog(@"p is: %f", p); //the value is written successfully
[self getInverseCDFValue:p]; //just calling another method for calculations

pValue = iCFDValue;
}

它适用于传递单个值,但不适用于数组。这在setter方法中是不允许的吗?

谢谢

4

2 回答 2

1

当你合成你的属性时,Xcode 将为你的属性生成 setter 和 getter,除非你的属性是只读的。在这种情况下,它将只为您创建 getter 方法。因此,按照命名约定,假设您有一个类型为 double 的属性名称toto,您的 setter 将是

-(void)setToto:(double d).

但是您可以做的是创建另一种方法来设置您的属性。但是,您需要将方法名称更改为其他名称。例如,

-(void)setTotoWithNSArray:(NSArray *).

于 2013-09-12T19:55:07.563 回答
1

您已经定义了一个pValue类型为的属性double。Objective-C 现在期望存在一个访问器和一个获取器,其名称为:

- (double)pValue; // Getter
- (void)setPValue:(double)value; // Setter

要么让 Objective-C 为你自动生成它们,要么你需要明确地提供它们。

现在您提供了一个名称相同但类型不同的方法 ( NSArray)。类型不同,这就是错误消息告诉您的内容:编译器认为该方法是您的属性的设置器,但您给了它错误的类型。它告诉您,因为由于您违反了预期,因此无法在某些情况下正确使用该属性,例如键值编码。在几乎所有情况下,您所做的都被认为是一个错误。

您可以将pValue属性设为只读,我认为这会使警告消失,但它仍然会很糟糕,因为类型差异令人困惑。相反,将带有数组参数的设置器重命名为其他名称:

- (void)setPValueFromArray:(NSArray *)anArray;
于 2013-09-12T19:55:51.267 回答