1

这是我在此的头一篇博文。我对 Obj-C 只有一点经验。我在 Lion 上的 XCode 3 中非常不推荐使用的 AppleScript Studio 中进行开发,但创建了一些 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])相同的错误。

任何人都可以对此有所了解,希望有正确的代码吗?

4

1 回答 1

0

您应该尽量避免测试NSString反对NULLnil或其他什么。这主要是您在 C 或 C++ 中使用的东西。在目标 C 中,您可以执行以下操作:

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

但是,这仅在 [event location] 不等于 nil 时才有效,如下面的 Richard 所指出的。在 Objective-C 中,当你尝试运行类似的东西时不会引发错误[nil IsEqualToString:@""],它只是返回nil。if/then 将因此不会被执行。他的替代方案更安全:

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

PS:有关 IsEqualTo 方法范围的信息,请参阅苹果网站或您的 XCode 上的文档。您可以将一个字符串与整个丢失的有趣的其他事物进行比较。

PPS:另一件事可能是您[eachEvent location]在未初始化位置属性的事件上使用。这确实是理查德的修正派上用场的情况。

让我知道它是否仍然不起作用!

于 2012-06-17T18:38:53.850 回答