我今天在看一段代码,注意到这个特定的编码器使用点符号来访问实例方法(这些方法不接受值,它们只返回值)。
例如:
@interface MyClass : NSObject {
}
-(double)add;
@end
@implementation MyClass
-(double)valueA {
return 3.0;
}
-(double)valueB {
return 7.0;
}
-(double)add {
return self.valueA + self.valueB;
}
@end
他在他的代码中做到了这一点并且编译器没有提示,但是当我像上面的例子一样在我的代码中尝试它时,我得到以下错误:“在非结构或联合的东西中请求成员“valueA” ”。我错过了什么,知道吗?
最佳答案
点语法通常应用于声明的属性,但这不是强制性的。使用 obj.valueA
和 obj.valueB
确实有效。
您收到的错误消息可能是由于对象没有显式类型 MyClass *
。例如以下作品:
MyClass *obj1 = [MyClass new];
NSLog(@"%f %f %f", obj1.valueA, obj1.valueB, [obj1 add]);
另一方面:
MyClass *obj1 = [MyClass new];
NSLog(@"%f %f %f", obj1.valueA, obj1.valueB, [obj1 add]);
id obj2 = obj1;
NSLog(@"%f %f %f", obj2.valueA, obj2.valueB, [obj2 add]);
给出:
error: request for member ‘valueA’ in something not a structure or union
error: request for member ‘valueB’ in something not a structure or union
因为 obj2
的类型是 id
,所以编译器没有足够的信息知道 .valueA
和 .valueB
实际上是getter 方法-valueA
和-valueB
。如果您将 MyClass
类型的对象放在 NSArray
中,然后通过 -objectAtIndex:
检索它们,就会发生这种情况,因为此方法返回一个通用对象id
类型。
为了安抚编译器,您需要将对象转换为 MyClass *
,然后才使用点语法。您可以通过以下方式完成此操作:
MyClass *obj2 = obj1;
// or
MyClass *obj2 = [someArray objectAtIndex:someIndex];
// and then
obj2.valueA
或者,如果 obj2
声明为 id
:
((MyClass *)obj2).valueA
或者,如果对象由返回类型为 id
的方法返回:
((MyClass *)[someArray objectAtIndex:someIndex]).valueA
或者,您可以简单地完全摆脱点语法(我最喜欢的):
[obj2 valueA]
[[someArray objectAtIndex:someIndex] valueA]
关于iphone - 对实例方法使用点符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6364555/