2015-01-05 3 views
0

Я практикую свои навыки Objective C и столкнулся с небольшой проблемой, хотя я не могу найти прямой ответ на этот вопрос в любом месте, где бы я ни выглядел. В руководствах разработчика Apple, которые я читаю, ничего не сказано о том, как использовать метод фабрики класса с несколькими параметрами (скажем, 3 параметра) и вернуть инициализированный объект с помощью переопределенного метода init.Class Factory Method с несколькими параметрами

Здесь у меня есть простой класс под названием XYZPerson.

@implementation XYZPerson 

// Class Factory Method 
+ (id)person:(NSString *)firstName with:(NSString *)lastName andWith:(NSDate *)dateOfBirth { 
    // need to return [ [self alloc] init with the 3 paramaters]; here 
    // Or some other way to do so.. 
} 

// Overridden init method 
- (id)init:(NSString *)firstName with:(NSString *)lastName andWIth:(NSDate *)dateOfBirth { 
    self = [super init]; 

    if (self) { 
     _firstName = firstName; 
     _lastName = lastName; 
     _dateOfBirth = dateOfBirth; 
    } 

    return self; 
} 

// Use the initialized instance variables in a greeting 
- (void)sayHello { 
    NSLog(@"Hello %@ %@", self.firstName, self.lastName); 
} 

А потом в моей основной я экземпляра объекта XYZPerson

XYZPerson *person = [XYZPerson person:@"John" with:@"Doe" andWith:[NSDate date]]; 
[person sayHello]; 

Может кто-нибудь дать мне небольшой указатель на том, как сделать это правильно?

ответ

1

Если я правильно понял ваш вопрос, вы хотите следующее:

+ (id)person:(NSString *)firstName with:(NSString *)lastName andWith:(NSDate *)dateOfBirth { 
    XYZPerson *result = [[self alloc] init:firstName with:lastName andWith:dateOfBirth]; 

    return result; 
} 

Если вы не используете ARC, добавьте autorelease к return.

BTW - изменить тип возврата init на instancetype вместо id.

+1

Вы также можете изменить тип возврата указанного метода на 'instancetype'. – Fabian

+0

Спасибо, отлично! –

+0

Рад, что я мог помочь. Не забудьте принять ответ. – rmaddy

0
@implementation XYZPerson 

// Class Factory Method 
+ (instanceType) person:(NSString *)firstName with:(NSString *)lastName andWith:(NSDate *)dateOfBirth { 

return [[[self class] alloc]init: firstName with: lastName andWith:dateOfBirth]; 

} 

- (instanceType) init:(NSString *)firstName with:(NSString *)lastName andWIth:(NSDate *)dateOfBirth { 
    self = [super init]; 

    if (self) { 
     _firstName = [firstName copy]; 
     _lastName = [lastName copy]; 
     _dateOfBirth = [dateOfBirth copy]; 
//nb added copy to each of these, we do not own these objects, they could be lost to us.. 

/// or you could do this instead.. 
//assuming you synthesised getters/setters for (strong) properties.. 

[self setFirstName:firstName]; 
[self setLastName:lastName]; 
[self setDateOfBirth: dateOfBirth]; 

    } 

    return self; 
} 
+0

Я не считаю, что [self class] уместен здесь - он может работать, но его не нужно. Я не является экземпляром XYZperson в методе класса (+). –