2012-01-24 4 views
1

У меня есть набор файлов Objective-C в моем приложении с надписью Crop.h/Crop.m. Внутри находится пользовательский массив различных овощей из видеоигры - каждый овощ имеет свойства, такие как имя, вегетационный период, количество дней для роста и т. Д.Как вернуть пользовательский объект Objective-C из метода класса?

Мне нужно написать функцию, которая проходит через этот массив и проверяет каждый Значение имени урожая, чтобы увидеть, совпадает ли оно с моим заголовком (self.title). Ниже приведен пример двух объектов культур:

Crop *turnip = [[Crop alloc] init]; 
[turnip setName:@"Turnip"]; 
[turnip setSeason:@"Spring"]; 
[turnip setBagPrice:120]; 
[turnip setSaleValue:60]; 
[turnip setDaysToGrow:5]; 
[turnip setRenewableDays:0]; 

Crop *potato = [[Crop alloc] init]; 
[potato setName:@"Potato"]; 
[potato setSeason:@"Spring"]; 
[potato setBagPrice:150]; 
[potato setSaleValue:80]; 
[potato setDaysToGrow:8]; 
[potato setRenewableDays:0]; 

Тогда то, что я имею в виду называет новую функцию класса под названием returnCropData: который принимает self.title в качестве параметра. Я просто не уверен, что это мой лучший метод ... Я был бы признателен за любые предложения от разработчиков iOS.

Вот простой метод класса, который у меня есть, пока нет данных, поскольку я все еще пытаюсь выяснить, какой цикл будет лучше. Я также изо всех сил, чтобы выяснить синтаксис, чтобы добавить параметр NSString на функцию

+ (Crop *)returnCropData 
{ 
    Crop *turnip = [[Crop alloc] init]; 
    [turnip setName:@"Turnip"]; 
    [turnip setSeason:@"Spring"]; 
    [turnip setBagPrice:120]; 
    [turnip setSaleValue:60]; 
    [turnip setDaysToGrow:5]; 
    [turnip setRenewableDays:0]; 

    // more crops here.... 

    NSMutableArray *cropListing = [[NSMutableArray alloc] init]; 
    [cropListing addObject:turnip]; 
    [cropListing addObject:potato]; 
    // add the other crops here... 

    return potato; 
    // return any Crop value for now 
} 
+2

Ваш вопрос не очень ясен ... Вы просите о том, как создать функцию, которая возвращает определенный объект Crop на основе строки, которую вы передаете? – MechEthan

+0

@yAak да совершенно! Так, например, перейдите в строку «Картофель», и эта функция вернет весь объект Crop картофеля. Согласование будет против свойства 'name' урожая (созданного с помощью 'setName'). Я знаю, что это немного запутанно. Пожалуйста, дайте мне знать, если что-то конкретное, я могу уточнить в деталях. – Jake

ответ

3

Objective-C документы Apple, рекомендуется использовать objectWithParams: грамматику для методов класса (застройщиками). Так что в вашем случае, вы должны изменить свое имя существующего метода для

+ (Crop *)cropWithName:(NSString *)name

И называть его Crop *turnip = [Crop cropWithName:@"Turnip];

, а затем в ваш цикл, вы можете проверить, если передаваемая на имя равно имя вашего объект с [name isEqualToString:turnip.name].

Это будет работать, однако кажется, что каждый раз, когда этот метод называется, вы создаете тонну объектов Crop - время с вашей стороны и интенсивность памяти на устройстве. Вместо этого вы должны посмотреть на файл plist, который использует словарь для представления каждого вида Crop, а затем в вашем методе создания вы можете использовать переданное имя для поиска всей другой информации об указанной культуре. Затем вы можете просто вернуть один экземпляр Crop вместо создания массивной суммы.

Вот ссылка Apple, документации, которая объясняет plists:

https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/PropertyLists/Introduction/Introduction.html

В частности, в каких-либо объектов, которые я хочу, чтобы вытащить из списка свойств я определяю следующий метод, который принимает значения из словаря и устанавливает свойства объекта:

- (id)initWithDictionary:(NSDictionary *)dictionary 
{ 
    self = [super init]; 

    [self setValuesForKeysWithDictionary:dictionary]; 

    return self; 
} 

а потом в классе, где я хочу получить доступ к массиву данных, я хотел бы создать синтезированный @property, а затем определить этот метод (в данном случае, у меня есть песни OBJE каратов):

- (NSMutableArray *)songs 
{ 
    if (_songs == nil) 
    { 
     NSArray *songDicts = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"ChillMix" ofType:@"plist"]]; 

     _songs = [[NSMutableArray alloc] initWithCapacity:[songDicts count]]; 


     // Fast enumeration // 
     for (NSDictionary *currDict in songDicts) 
     { 
      Song *song = [[Song alloc] initWithDictionary:currDict]; 
      [_songs addObject:song]; 
     } 
    } 
    return _songs; 
} 

Вот пример проекта я разработал: https://github.com/Jlawr3nc3/MusicLibraryiOS

[NSArray arrayWithContentsOfFile:] должен быть вашим лучшим другом. Это потрясающе. Если вы можете отформатировать формат XML в формате plist, вы можете отказаться от него. Один. линия. для анализа данных. (PS обычный XML раздражает, как ад, разобрать на iOS, так что это огромная экономия времени, если вы можете избежать прямого XML).

Кроме того, я не уверен, что будет использоваться для создания объекта обрезки на основе заголовка представления. Поскольку вы уже знаете имя урока перед созданием представления, вы можете создать объект Crop и установить свойство Crop для представления на объект обреза, который вы создали, а затем в viewDidLoad просто введите self.title = self.crop.name;. Наконец, если у вас есть UITableView объектов обрезки, вы не должны заполнять представление таблицы статическим текстом; вместо этого заселите его объектами, которые вы создаете из plist, а затем в didSelectRowAtIndexPath: вы можете сделать [self.arrayOfCrops objectAtIndex:indexPath.row], чтобы получить объект, на который вы нажмете, и передать его с видом, который вы загружаете. Во всяком случае, проверьте образец кода Apple для получения дополнительной информации о plists и tableviews и т. Д., Потому что у них есть много информации об этом конкретном материале.

+1

Да, я думаю, ты прав Джек, спасибо! У вас есть какие-либо ресурсы от SO или других статей по созданию такого plist? Я вообще не знаком с настройкой объектов модели, я не был уверен, каким будет лучший метод, поэтому я просто создал один файл большого класса. Я согласен с тем, что интенсивно создавать все эти объекты сразу - я знал, что должно быть лучшее решение! Я рассматривал XML, но это кажется хуже .. Я немного поработаю для примера кода plist – Jake

+1

Также я понятия не имел о синтаксисе 'ObjectWithParams: param' на конструкторах, поэтому еще одно большое спасибо за то, что вы меня перевернули. – Jake

+1

Добро пожаловать! Посмотрите пример кода Apple на http://developer.apple.com, потому что они говорят об этом точно. Я также проверю и вернусь к вам с некоторыми ссылками. И да, грамматика Apple потрясающая. Я бы никогда не подумал об этом, но как только узнал об этом, я понял, что это тонна смысла и дает более читаемый код. –

Смежные вопросы