我不太了解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但它一直给我意外错误。谢谢和问候。
答案 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"];
这两种方式都会使person
或person2
成为Person
类型的对象,它会为这样的调用返回正确的值:
person.firstName
person.lastName
person.fullName