Objective C属性与参数

时间:2013-12-14 23:17:02

标签: ios objective-c

我不太了解Objective C以及Properties和arguments如何工作。 我似乎遇到了面向对象的设计错误:我试图将有关对象状态的信息传递给其中一个方法。有人可以向我解释这个代码如何与Person类一起使用,它将firstName和lastName作为参数:

Person.m
#import "Person.h"

@implementation Person
- (NSString *)fullNameWithFirstName:(NSString *)firstName lastName:(NSString *)lastName;
{
  return [NSString stringWithFormat:@"%@ %@", firstName, lastName];
}
@end

我该如何解决这个错误? 我试图开始修复这个设计错误,并将自己添加到Name但它一直给我意外错误。谢谢和问候。

1 个答案:

答案 0 :(得分:1)

目前你所做的并不是很有意义。您发布的方法没有什么不同,只需调用[NSString stringWithFormat:]代替您调用此方法的位置。您不会修改类中的任何内容。您不从类中检索数据。


假设Person类用于保存某个人的姓名,您的头文件可能会有一些属性:

@property (nonatomic,strong) NSString *firstName;
@property (nonatomic,strong) NSString *lastName;
@property (readonly,nonatomic,strong) NSString *fullName;

.m文件将包含几种不同类型的方法。

  • init种方法
  • factory种方法
  • accessor您要覆盖的任何属性访问器的方法
  • 您可能需要的其他各种方法取决于您在课堂上的表现。

鉴于我们假设的属性已在标头中声明,您可以设置或检索名字,设置或检索姓氏。您也可以尝试检索姓氏,但.m中没有任何逻辑来设置它(并且它只在.m之外读取),它只返回nil。如果不在.m文件中放置任何内容,则以下内容均有效:

Person *person = [[Person alloc] init];
person.firstName = @"John";
person.lastName = @"Doe";
NSLog(@"%@ %@", person.firstName, person.lastName); //prints "John Doe"

由于fullName实际上只是名字和姓氏的串联,我们可以覆盖它的getter(在我们标记readonly时没有setter)以防止我们的类保留一个实例变量。所以这看起来像这样:

-(NSString*)fullName {
    return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
}

现在fullName属性动态构建一个fullName字符串并返回该字符串,而不是在内存中保留一个单独的变量。


一个名为fullNameWithFirstName:lastName:的方法似乎适合作为factory方法,但根据命名约定,它实际上应该被称为personWithFirstName:lastName:

它应该看起来像这样:

+(instancetype)personWithFirstName:(NSString*)firstName 
    lastName:(NSString*)lastName {
    return [[Person alloc] initWithFirstName:firstName lastName:lastName];
}

所以它只是调用一个指定的初始值设定项,它可能如下所示:

-(id)initWithFirstName:(NSString*)firstName lastName:(NSString*)lastName {
    self = [super init];
    if(self) {
        self.firstName = firstName;
        self.lastName = lastName;
    }
    return self;
}

使用此代码,您可以执行以下操作:

Person *person = [[Person alloc] initWithFirstName:@"Steve" lastName:@"Jobs"];
Person *person2 = [Person fullNameWithFirstName:@"Bill" lastName:@"Gates"];

这两种方式都会使personperson2成为Person类型的对象,它会为这样的调用返回正确的值:

person.firstName
person.lastName
person.fullName