2

私は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'

どんな助けでもいただければ幸いです。ありがとう。

4

4 に答える 4

10

キーは、辞書内のオブジェクトにアクセスするために使用するものです。コードで呼び出すすべての行で、キーとオブジェクトを逆にし-[bookmarks setObject:... forKey...]ます。あなたの場合の問題は、NSURL オブジェクトを NSString オブジェクトとして処理しようとしているために発生します — [bookmarks objectForKey:(NSString *)each]— そして辞書は、NSString には存在しますが NSURL には存在しない を呼び出すことによって想定される文字列の長さを取得しようとしています-length

常に同じオブジェクトでディクショナリを構築している場合は、よりコンパクトな "varargs" コンストラクタをNSDictionary. (最後のカンマ区切りの引数は nil でなければならないことに注意してください。関連ドキュメントを参照して-[NSDictionary dictionaryWithObjects:forKeys:]ください) URL とブックマーク名を含む 2 つの 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];

さらに、まだ言及されていない潜在的なエラーがあります: browseris anですが、 on ではなく , であるかのようにNSEnumerator呼び出しています。これにより、認識されていないセレクターでも同様のクラッシュが発生します。(ディクショナリ オブジェクトの場合でも、代わりに呼び出す必要があります。主にCocoa Bindingsに対して/によって使用され、必要のない余分な作業を行います。「キーと値のペア」の観点から考えると混乱することはわかっていますが、そこにはは...)valueForKey:NSDictionarybookmarks-objectForKey:-valueForKey:

最後に、列挙コードをいくらか単純化することもできます。( の for-in ループは、NSDictionaryちょうどそのキーを列挙します-keyEnumerator。)

最後の部分を行うことをお勧めする方法は次のとおりです。

NSURL *url
for (NSString *key in bookmarks) {
    url = [bookmarks objectForKey:key];
    NSLog(@"%@", [url absoluteURL]);
}
于 2009-06-29T18:55:20.577 に答える
4

ブックマーク辞書の初期化が逆になっています。

[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]);
}

[bookmarks allValues]を介して列挙し、最初にキーを取得する代わりにURLオブジェクトを直接取得することもできます(ただし、他の理由でキーが必要になる場合があります)。

于 2009-06-29T18:35:39.083 に答える
1

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);
}
于 2009-06-29T18:35:54.090 に答える
1

私は同じオンラインクラスに取り組んでいますが、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]);
}
于 2009-08-15T14:12:11.977 に答える