Календарное хранилище событий для объекта массива

Это мой первый пост здесь. Я только немного опыт с Obj-C. Я разрабатываю в очень устаревшей AppleScript Studio в XCode 3 на Lion, но создал несколько библиотек Obj-C для использования в моем программном обеспечении. Эти библиотеки предназначены для передачи значений из AppleScript и обратно. Один из них обращается к магазину календарей. Простите, если моя терминология безнадежно выключена.:)

Проблема заключается в попытке поместить "местоположение события" в объект в непостоянном массиве, который можно вернуть в AppleScript. Таким образом, я могу успешно получить практически все свойства события, кроме местоположения.

Вот (частичный) код с ошибками сборки, которые я получаю в комментариях:

NSEnumerator *eventEnumerator = [[calStore eventsWithPredicate:predicate] objectEnumerator];
   id event;
   while (event = [eventEnumerator nextObject]) {
NSMutableArray *eachEvent = [NSMutableArray arrayWithCapacity:10];


// the following, and most other properites not included here, works fine:

if ([event notes] == nil) {
[eachEvent addObject:[NSString stringWithFormat:@""]];
}
else
{
[eachEvent addObject:[event notes]]; //#06
}



@try {
if ([event location] == nil {
// error:
// invalid operands to binary == (have 'CGFloat' and 'struct NSNull *')

// incompatible type for argument 1 of 'addObject:'


[eachEvent addObject:[NSString stringWithFormat:@""]];
}
else
{
[eachEvent addObject:[event location]]; //#10
// error: incompatible type for argument 1 of 'addObject:'
}
}
@catch(NSException *exception) {
[eachEvent addObject:[NSString stringWithFormat:@"-10-"]];  // #10 dummy for location 
}

// now add all properties of this event (eachEvent) to all events information (eventInformation)
[eventInformation addObject:eachEvent];
   }
   return eventInformation;
}

Я попробовал вместо if ([event location] = nil { использовать if ([event location] == [NSNull null]) с той же ошибкой.

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

1 ответ

Вы должны стараться избегать тестирования NSString против NULL, nil или что угодно. Это в основном то, что вы бы использовали в C или C++. В цели C вы можете сделать:

...
if ( [ [event location] IsEqualToString:@""] ) {
...

Однако это будет работать, только если [местоположение события] не равно нулю, как указано Ричардом ниже. В target-C ошибка не возникает, когда вы пытаетесь запустить что-то вроде [nil IsEqualToString:@""], он просто возвращает ноль. Поэтому if/then не будет выполняться. Его альтернатива безопаснее:

...
if ( [ [event location] length ] == 0 ) {
...

PS: Смотрите документацию на веб-сайте Apple или в вашем XCode для получения информации о диапазоне методов IsEqualTo. Вы можете сравнить строку со всей потерей интересных других вещей.

PPS: Другое дело, что вы используете [eachEvent location] на событие, которое не было инициализировано свойство location. Это действительно ситуация, когда поправка Ричарда пригодится.

Дайте мне знать, если это все еще не работает!

Другие вопросы по тегам