質問

これまで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'

の手によりお願い申し上げます。感謝。

役に立ちましたか?

解決

A キー では多すぎるという方のアクセス オブジェクト の辞書です。お鍵オブジェ逆毎線呼び出す -[bookmarks setObject:... forKey...] のコードです。問題の場合で生じんなどの治療を試みようとしていNSURLオブジェクトのNSString物 [bookmarks objectForKey:(NSString *)each] —辞書が"することができるように、長さのこのような背景を受けて、文字列を呼び出し -length, 存在するためのNSStringなNSURL.

まず構築辞書と同じ物を使ってコンパクト"変数引数"のコンストラクタのための NSDictionary.(注:最後にコンマで区切されていなければnil見 の関連資料)も利用できます -[NSDictionary dictionaryWithObjects:forKeys:] 二NSArray物を含むUrlをブックマーク名です。(ちなみに、鋳造文字列リテラルとして 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];

また、お持ちの隠しているとエラーが表示されていない言及されていましたが、まだ browserNSEnumerator, サンジャンデヴィーニ呼び出し valueForKey: した場合と NSDictionary, ではなく、 bookmarks.その原因になりますので同様の衝突に対する認識、セレクタです。(でも、辞書オブジェは、呼び出す必要があ -objectForKey: 代; -valueForKey: が多く使用されてい/by ココアのバインディング, なので余分な作業ですよね。を実現で混乱して提供したいと考えています"サーバ上にkey-value形式で格納"が年を経て、今日に至っています。)

最後に、また単純化は、列挙されたコードを幾分強含んでいる。(A-ループは、 NSDictionary 列挙し、そのキーのように -keyEnumerator するパラメータである。)

こちらはかんらんの最後の部:

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

他のヒント

あなたはブックマーク辞書intiializationは逆転しています:

[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オブジェクトで取得して列挙することができます。

私は(と私はあなたがobjectForKey:ない、NSDictionaryの値を取得するにはvalueForKey:セレクタを使用するべきだと思います)URLを取得しようとしたとき、あなたのwhileループで間違った変数を参照していると思います

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に応答しないことがありますので、または列挙の特定のタイプがサポートされていないため、iPhone SDKにはないかもしれない(どちらか動作するようには思えないことがわかりましたよOSXに私は)分かりません。でも、私は次のようにそれが魅力のように動作するようになった...

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