NSDictionary 및 NSURL의 대상 C 문제
-
21-08-2019 - |
문제
나는 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]);
}