【发布时间】:2017-07-15 15:10:14
【问题描述】:
我正在学习 Swift 编程语言,在此期间,我有时会接触到旧的 Objective-C 编程语言及其代码。
我是一个绝对的初学者,因此我有一些问题可以更好地理解 Setter 和 Getter。
所以,我知道我可以通过 .h 文件中的花括号创建实例变量,但通常我使用属性。这些属性由实例变量支持,并自动提供 Getter 和 Setter 方法。
示例:
车辆.h文件:
@interface Vehicle : NSObject
@property int myProperty;
@end
因为我创建了这个属性,所以我不必在 vehicle.m 文件中声明 Getter 和 Setter 方法,因为它们是由编译器自动创建的。所以我可以创建一个车辆对象,设置并获取值。
示例
main.m
Vehicle *myvehicle = [[vehicle alloc] init];
[myvehicle myProperty] // myvehicle.myProperty
[myvehicle setMyProperty : 10] // myvehicle.myProperty = 10;
现在我读到可以覆盖我创建的属性“myProperty”的自动创建的 Getter 和 Setter 方法。在声明我自己的 Getter 和 Setter 版本时,我必须在 vehicle.h 和 vehicle.m 文件中声明两个方法。在vehicle.m 文件中,我不使用self 关键字调用对象,而是使用它自动创建的实例变量(_myProperty)。对吗?
我试过了,但总是出错,我不知道为什么,有什么意义。
示例
车辆.h文件:
@interface Vehicle : NSObject
@property int myProperty;
-(int) myProperty; //my new Getter method
-(void) setMyProperty: (int)updatedMyProperty; //My new Setter method
@end
车辆.m文件:
@implementation Vehicle
-(int) myProperty {
if (! _myProperty) {
_myProperty = NO;
}
return _myProperty;
}
-(void) setMyProperty: (int)updatedMyProperty {
if (_myProperty == updatedMyProperty) return;
_myProperty = updatedMyProperty;
}
@end
我总是收到错误“使用未声明的标识符”,我不知道为什么。如果我理解正确,我不必使用 @synthesize 声明 ivar 或其名称,因为编译器会自动为我创建名为 _myProperty 的 ivar。当我想更改 ivar 的名称时,我只需要使用 @synthesize。
我不知道我为什么会卡住,问题是什么。你能解释一下吗? 提前致谢!
【问题讨论】:
标签: objective-c oop overriding getter-setter