Objective-Cの問題はNSDictionaryで、NSURL
-
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'
の手によりお願い申し上げます。感謝。
解決
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];
また、お持ちの隠しているとエラーが表示されていない言及されていましたが、まだ browser
は NSEnumerator
, サンジャンデヴィーニ呼び出し 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]);
}