您是否正在使用某种教程或书籍?这是学习编写 OS X 或 iOS 应用程序的一个奇怪的起点。
无论如何,问题在于您已经将 getter/setter 的东西与实现其他功能的方法串通了起来。
我建议将您的Person
课程声明为:
@interface Person : NSObject
@property NSInteger age;
@property NSInteger weight;
@end
使用 Person.m:
@implementation Person
- (id) init {
self = [super init];
if (self) {
// preposterous initial values so we know if they weren't set.
_age = -1;
_weight = -1;
}
return self;
}
@end
也就是说,aPerson
仅保存有关单个人的信息。它不执行任何类型的 I/O 等...
然后,您的 main.m 看起来像:
#import <Foundation/Foundation.h>
#import "Person.h"
NSInteger ScanIntegerWithPrompt(NSString *prompt) {
printf("%s: ", [prompt UTF8String]);
int v;
scanf("%d", &v);
return (NSInteger) v;
}
int main(...) {
@autoreleasepool {
Person *p = [[Person alloc] init];
p.age = ScanIntegerWithPrompt(@"Enter age:");
p.weight = ScanIntegerWithPrompt(@"Enter weight:");
printf("Your age is %d and your weight is %d", p.age, p.weight);
}
return 0;
}
以这种方式构建代码将模型(数据容器)与控制层分开。这里没有太多的视图层。
如果您真的想将 I/O / 解析逻辑与Person
对象一起保留,请在 Person 对象中添加如下内容:
...
- (NSNumber)readIntegerWithPrompt:(NSString*)prompt
{
... same code as function above ...
}
- (void)readAgeFromStandardInput
{
self.age = [self readIntegerWithPrompt:@"Enter age: "];
}
- (void)readWeightFromStandardInput
{
self.weight = [self readIntegerWithPrompt:@"Enter weight: "];
}
...
然后你会从你的main
.