2012-06-17 3 views
1

이것은 내 첫 번째 게시물입니다. 나는 Obj-C에 대해서 조금 경험이있다. 라이온스의 Xcode 3에서 사용되지 않는 AppleScript Studio에서 개발했지만 내 소프트웨어에서 사용할 Obj-C 라이브러리를 몇 개 만들었습니다. 이 라이브러리는 AppleScript에서 값을 전달하거나 다시 전달하도록 설계되었습니다. 이 중 하나가 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] == [NSNull null])를 사용하는 대신 if ([event location] = nil {의 시도.

누구나 올바른 코드로이 문제에 관해 밝힐 수 있습니까?

답변

0

NULL, nil 등으로 테스트하지 않도록주의해야합니다. 이것은 C 또는 C++에서 주로 사용하는 것입니다. 목표 C에서, 당신은 할 수 :

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

그러나,이 경우에만 작동합니다 [이벤트 위치] 아래, 리차드에 의해 지적 전무 동일하지 않은 경우. objective-C에서 [nil IsEqualToString:@""]과 같은 것을 실행하려고 시도하면 오류가 발생하지 않고 단지 이 아닌을 반환합니다. 따라서 if/then은 실행되지 않습니다.

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

PS : 그의 대안은 안전 사과 웹 사이트 또는 방법의 IsEqualTo 범위에 대한 자세한 내용은 엑스 코드의 문서를 참조하십시오. 문자열을 다른 재미있는 것들과 비교할 수 있습니다.

PPS : 위치 속성을 초기화하지 않은 이벤트에서 [eachEvent location]을 사용하고있는 것일 수도 있습니다. 리차드의 수정이 도움이되는 상황입니다.

그래도 작동하지 않으면 알려주세요.

+0

'event.location == nil '일 때 작동하지 않을 것입니다.'[string length] == 0'을 체크해야합니다. 이것은 nil과 빈 문자열에 대해 작동합니다. –

+0

조명의 힌트를 주셔서 감사합니다. 불행히도 빈/nil 문자열 문제는 의심 할 여지없이 모든 비교 또는 예외 검사를 벗어난 경우에도 여전히 지정된 빌드 오류가 발생합니다. 즉, 다음 문과 함께 : "[eachEvent addObject : [event location]];" AddObj의 인수 1에 대해 "호환되지 않는 유형"의 빌드 오류가 발생합니다. 그래서 ... 첫 번째 문제는 eachEvent 객체를 제대로 초기화하는 것 같습니다. 내가 사용하는 전체 코드를 제공 했으므로 그 점에서 내가 뭘 잘못하고 있니? 감사. –

+0

... 그리고 이러한 생각이 필요한 것이 아닌 경우에는 실제로 피연산자에 무엇이 있는지 알고 있으면 편리합니다. NSLog (@ operand1 : % @ ", [event location]);'... . – markjs