Как ссылаться на объекты в NSMutableSets
У меня есть небольшая библиотека C#, которую я пытаюсь перенести (фактически переписывая код C#, используя ее в качестве руководства) в Obj-C. Цель библиотеки - генерировать повторяющиеся встречи для приложения календаря iOS. У меня проблемы с переносом структур C# на объекты Obj-C. Вот что я имею для одной из структур, которая содержит информацию о назначении:
@interface Appointment : NSObject {
@public
NSDate *apptStartTime;
NSDate *apptEndTime;
NSString *key;
}
@end
Один из написанных мною методов принимает дату, набор расписаний (также порт C# struct
) и список встреч (я использую NSMutableSet
который содержит интерфейс назначения выше). Если мне удастся заставить работать метод назначения, я почти уверен, что смогу выяснить остаток (я думаю). Это код, который добавляет встречи к NSMutableSet
:
-(void) addAppointmentsForDate:(NSDate *)checkDate andSchedules: (NSMutableSet *)schedules andAppt:(NSMutableSet *)appointments {
Appointment *appt = [[Appointment alloc]init];
for(NSMutableSet *schedule in schedules) {
if(schedule.occursOnDate(checkDate)) {
appt = [self generateAppointment:checkDate andSchedule: [schedules removeObject:schedules]];
[appointments addObject: appt];
}
}
}
-(Appointment *) generateAppointment: (NSDate *) checkDate andSchedule: (Schedule *) schedule {
Appointment *appt = [[Appointment alloc]init];
appt->apptStartTime = schedule->timeOfAppointment;
appt->apptEndTime = nil; // TODO
appt->key = schedule->key;
return appt;
}
Я получаю ошибки сборки на if
заявление:
Отправка void параметру несовместимого типа Schedule *
Я никогда не пользовалась NSMutableSets
раньше, и я не пытался портировать с C# раньше. У меня есть время с портом структуры C#, как вы можете видеть. Я прочитал все документы Apple по сетам и несколько документов, объясняющих различия между C# и Obj-C.
Может кто-нибудь, пожалуйста, объясните, что я делаю неправильно, или укажите мне несколько хороших документов, которые могут дать мне пример ссылки на элементы в наборах?
2 ответа
Вместо этого:
@interface Appointment : NSObject {
@public
NSDate *apptStartTime;
NSDate *apptEndTime;
NSString *key;
}
@end
пожалуйста, пожалуйста, пожалуйста, напишите
@interface Appointment : NSObject
@property (readwrite, nonatomic, strong) NSDate* startTime;
@property (readwrite, nonatomic, strong) NSDate* endTime;
@property (readwrite, nonatomic, strong) NSString* key;
@end
Не делайте переменные экземпляра общедоступными. Переменные экземпляра никогда не должны быть доступны напрямую за пределами кода, принадлежащего этому классу.
Всегда начинайте переменные экземпляра с символа подчеркивания, например _startTime. Таким образом, любой доступ к переменной экземпляра выделяется. (Код выше создаст переменные экземпляра для вас).
Используйте аксессоры, если у вас нет очень веских причин не делать этого.
Глядя на код, у меня складывается впечатление, что вы не совсем уверены, пишете ли вы код на C++ или Objective-C.
if(schedule.occursOnDate(checkDate))
Как вы снова вызываете метод Objective-C?
for(NSMutableSet *schedule in schedules)
Вы в этом уверены? расписаний является NSMutableSet*. То есть вы говорите, что элементы вашего изменяемого набора расписаний снова являются изменяемыми наборами? Это довольно необычно, но если вы так говорите...
appt = [self generateAppointment:checkDate andSchedule: [schedules removeObject:schedules]];
Это более чем странно. Что вы думаете
[schedules removeObject:schedules]
собираюсь сделать? Вы ожидаете, что набор будет иметь себя как элемент?
Мой совет: ложись спать. Имейте десять часов сна. После хорошего завтрака снова посмотрите код.