سؤال

أنا جديدة على الهدف-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.

إذا كنت دائما بناء القاموس مع نفس الأشياء, النظر في استخدام أكثر إحكاما "varargs" منشئ NSDictionary.(علما أن آخر فاصلة يجب أن يكون حجة النيل — انظر الوثائق ذات الصلة) يمكنك أيضا استخدام -[NSDictionary dictionaryWithObjects:forKeys:] مع اثنين من 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: يستخدم في الغالب/من قبل الكاكاو الارتباطات, و لا عمل إضافي لا تحتاج.أدرك أنها مربكة منذ التفكير في "أزواج قيمة المفتاح" ، ولكن هناك ما هو...)

أخيرا, يمكنك أيضا تبسيط التعداد رمز إلى حد ما.(أ-في حلقة على 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 مباشرة بدلا من الحصول على مفاتيح أولا (على الرغم من أنك قد ترغب أيضا مفاتيح لسبب آخر).

وأعتقد أنك في اشارة الى متغير خطأ في حلقة في حين الخاص بك عند محاولة الحصول على URL (وأعتقد أنك يجب أن تستخدم محدد 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 أو بسبب لا يتم اعتماد نوع معين من تعداد (ربما ليس في 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