1

これは私の最初の投稿です。私は Obj-C の経験が少ししかありません。私は Lion の XCode 3 で非常に非推奨の AppleScript Studio で開発していますが、私のソフトウェアで使用するためにいくつかの Obj-C ライブラリを作成しました。これらのライブラリは、AppleScript との間で値をやり取りするように設計されています。これらの 1 つは、Calendar Store にアクセスします。私の用語が絶望的に​​ずれている場合はご容赦ください。:)

問題は、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

NSStringagainstNULLなどのテストを避けるようにしてくださいnil。これは、主に C または C++ で使用するものです。Objective C では、次のことができます。

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

ただし、これは、以下のリチャードが指摘したように、[イベントの場所] が nil に等しくない場合にのみ機能します。Objective-C では、 のようなものを実行しようとしてもエラーは発生せず[nil IsEqualToString:@""]、単にnilを返します。したがって、if/then は実行されません。彼の代替案はより安全です。

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

PS: メソッドの IsEqualTo 範囲については、アップルの Web サイトまたは XCode のドキュメントを参照してください。文字列を、他の興味深いものをすべて失ったものと比較できます。

PPS: もう 1 つのことは[eachEvent location]、場所のプロパティが初期化されていないイベントで使用している可能性があります。これは、実際にリチャードの修正が役立つ状況です。

それでもうまくいかない場合はお知らせください。

于 2012-06-17T18:38:53.850 に答える