Календарное хранилище событий для объекта массива
Это мой первый пост здесь. Я только немного опыт с 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. Это действительно ситуация, когда поправка Ричарда пригодится.
Дайте мне знать, если это все еще не работает!