문제

나는 Objective-C를 처음 접 했고이 코드가 작동하지 않는 이유는 없습니다.

    NSMutableDictionary *bookmarks = [NSMutableDictionary dictionaryWithCapacity:(NSUInteger) 4];
[bookmarks setObject:@"Stanford University" forKey:[NSURL URLWithString:(NSString *) @"http://www.stanford.edu"]];
[bookmarks setObject:@"Apple" forKey:[NSURL URLWithString:(NSString *) @"http://www.apple.com"]];
[bookmarks setObject:@"Berkeley" forKey:[NSURL URLWithString:(NSString *) @"http://www.berkeley.edu"]];
[bookmarks setObject:@"CS193P" forKey:[NSURL URLWithString:(NSString *) @"http://cs193p.stanford.edu"]];

NSEnumerator *browser = [bookmarks keyEnumerator];
id each;
NSURL *url;
while ((each = [browser nextObject])) {
    url = [browser valueForKey:(NSString *)each];
    NSLog(@"%@", [url absoluteURL]);
}

내가 얻는 오류는 다음과 같습니다.

2009-06-29 11:25:22.844 WhatATool[2102:10b] *** -[NSURL length]: unrecognized selector sent to instance 0x1072c0
2009-06-29 11:25:22.845 WhatATool[2102:10b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL length]: unrecognized selector sent to instance 0x1072c0'

모든 도움이 감사하겠습니다. 감사.

도움이 되었습니까?

해결책

열쇠 액세스하는 데 사용하는 것입니다 물체 사전에서. 당신은 당신이 호출하는 모든 줄에 당신의 열쇠와 물체가 반전되어 있습니다. -[bookmarks setObject:... forKey...] 코드에서. NSURL 객체를 NSString 객체로 취급하려고하기 때문에 귀하의 경우 문제가 발생합니다. [bookmarks objectForKey:(NSString *)each] - 사전은 전화하여 가정의 길이를 얻으려고합니다. -length, NSSTRING에는 존재하지만 NSURL에는 존재하지 않습니다.

항상 동일한 객체로 사전을 구성하는 경우 더 컴팩트 한 "Varargs"생성자를 사용하는 것을 고려하십시오. NSDictionary. (마지막 쉼표로 구분 된 인수는 nil이어야합니다. 관련 문서) 사용할 수도 있습니다 -[NSDictionary dictionaryWithObjects:forKeys:] URL과 북마크 이름을 포함하는 두 개의 nsarray 객체가 있습니다. (우연히, 문자 그럴을 주조하십시오 NSString* NSURL을 만드는 것은 완전히 불필요합니다.)

NSDictionary *bookmarks = [NSDictionary dictionaryWithObjectsAndKeys:
                           [NSURL URLWithString:@"http://www.stanford.edu"],
                           @"Stanford University",
                           [NSURL URLWithString:@"http://www.apple.com"],
                           @"Apple",
                           [NSURL URLWithString:@"http://www.berkeley.edu"],
                           @"Berkeley",
                           [NSURL URLWithString:@"http://cs193p.stanford.edu"],
                           @"CS193P",
                           nil];

또한 아직 언급되지 않은 숨어있는 오류가 있습니다. browser 이다 NSEnumerator,하지만 당신은 전화합니다 valueForKey: 마치 마치 마치 NSDictionary, bookmarks. 이는 인식되지 않은 선택기에 대해서도 비슷한 충돌을 일으킬 것입니다. (사전 개체의 경우에도 호출해야합니다 -objectForKey: 대신에; -valueForKey: 주로/by에 사용됩니다 코코아 바인딩, 필요하지 않은 추가 작업을 수행합니다. 우리가 "키 가치 쌍"의 관점에서 생각하기 때문에 혼란스러워한다는 것을 알고 있지만 ...)

마지막으로, 열거 코드를 다소 단순화 할 수도 있습니다. (an의 for-in 루프 NSDictionary 열쇠를 열거합니다 -keyEnumerator 일 것이다.)

마지막 부분을 수행하는 방법은 다음과 같습니다.

NSURL *url
for (NSString *key in bookmarks) {
    url = [bookmarks objectForKey:key];
    NSLog(@"%@", [url absoluteURL]);
}

다른 팁

북마크 사전 종교화가 반대로 반대됩니다.

[bookmarks setObject:@"Stanford University" forKey:[NSURL URLWithString:(NSString *) @"http://www.stanford.edu"]];

해야한다:

[bookmarks setObject:[NSURL URLWithString:(NSString *) @"http://www.stanford.edu"] forKey:@"Stanford University"];

또한 열거하는 방법이 더 간단합니다.

NSURL *url;
for ( NSString *each in [bookmarks allKeys] ) 
{
        url = [browser objectForKey:(NSString *)each];
        NSLog(@"%@", [url absoluteURL]);
}

또한 [북마크 AllValues]를 열거하여 키를 먼저 꺼내는 대신 URL 객체를 직접 얻을 수 있습니다 (다른 이유로 키를 원할 수도 있지만).

URL을 얻으려고 할 때 while 루프의 잘못된 변수를 언급한다고 생각합니다 (그리고 사용해야한다고 생각합니다. objectForKey: nsdictionary의 값을 얻는 선택기는 아닙니다. valueForKey:):

NSEnumerator *browser = [bookmarks keyEnumerator];
id each;
NSURL *url;
while ((each = [browser nextObject])) {
    url = [bookmarks objectForKey:(NSString *)each]; // <-- bookmarks, not browser
    NSLog(@"URL = %@", url);
}

나는 동일한 온라인 클래스를 통해 일하고 있는데, nsenumerator가 ObjectforKey에 응답하지 않을 수 있거나 특정 유형의 열거가 지원되지 않기 때문에 위의 답변 중 어느 것도 작동하지 않는다는 것을 발견했습니다 (OSX I에 비해 iPhone SDK에 있지 않을 수도 있습니다. 모르겠다). 그래도 다음과 같이 매력처럼 작동하게되었습니다 ...

NSString *aKey;
NSEnumerator *keyEnumerator = [bookmarks keyEnumerator];
NSURL *url;

while (aKey = [keyEnumerator nextObject])
{
    url = [bookmarks objectForKey:aKey];
    NSLog(@"value: %@", [url absoluteURL]);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top