如何使用NSDictionary

3
我将尝试解释如何使用NSDictionary,因此我创建了两个文件。第一个文件是bookStore。
这是它的接口:
#import <Foundation/Foundation.h>
#import "Book.h"


@interface Bookstore : NSObject {

    NSDictionary* myBookStore;

}

@property(retain) NSDictionary* myBookStore;

-(id)init;
-(void)printInvetory;
-(BOOL)addBook:(Book*)newBook;
-(BOOL)removeBookWithTitle:(NSString*)whichTitle;
-(BOOL) findBook:(NSString*)whatLook;
-(void) dealloc;


@end

这是实现部分

#import "Bookstore.h"
#import "Book.h"

@implementation Bookstore

@synthesize myBookStore;

-(id)init {

    self=[super init];
    if (self!=nil) {
        myBookStore=[[NSMutableDictionary alloc] init];
    }
    return self;

}

-(BOOL)addBook:(Book*)newBook {

    [myBookStore setObject:newBook forKey:newBook.title];
    return YES;

}

-(BOOL) removeBookWithTitle:(NSString *)whichTitle {

//    if ([myBookStore ObjectForKey:whichTitle]!=nil) {
        [myBookStore removeObjectForKey:whichTitle];
        return YES;

 //   }

    return NO;

}

-(BOOL) findBook:(NSString *)whatLook {

    Book *book;
    for (NSString* key in myBookStore) {
       if ([myBookStore objectForKey:key]==whatLook ){
            book=[myBookStore objectForKey:key];
            NSLog(@"      Title: %@ ",book.title);
            NSLog(@"     Author: %@ ",book.author);
            NSLog(@"Description: %@ ",book.description);
            NSLog(@"Id number: %d " , book.idNumber);
        }



    }

}

-(void) printInvetory {

    Book *book;
    for (NSString* key in myBookStore) {
        book= [ myBookStore objectForKey:key];
        NSLog(@"      Title: %@ ",book.title);
        NSLog(@"     Author: %@ ",book.author);
        NSLog(@"Description: %@ ",book.description);
        NSLog(@"Id number: %d " , book.idNumber);
    }

}

-(void) dealloc {

    self.myBookStore = nil;
    [super dealloc];

}



@end

第二个是书籍

这是界面

#import <Foundation/Foundation.h>

@interface Book : NSObject {

    NSString *title;
    NSString *author;
    NSString *description;
    int idNumber;
}

@property (nonatomic,retain) NSString* title;
@property (nonatomic,retain) NSString* author;
@property (nonatomic,retain) NSString* description;
@property (nonatomic) int idNumber;

-(id) initWithTitle:(NSString*)newTitle author:(NSString*)newAuthor description:(NSString*)newDescription idNumber:(int) newIdNumber;




@end

这是实现代码

#import "Book.h"

@implementation Book

@synthesize title,author,description,idNumber;

-(void) initWithTitle:(NSString*)newTitle author:(NSString*)newAuthor description:(NSString*)newDescription idNumber:(int)newIdNumber {

    title=newTitle;
    author=newAuthor;
    description=newDescription;
    idNumber=newIdNumber;

}

@end

这是主文件。

#import <Foundation/Foundation.h>
#import "Book.h"
#import "Bookstore.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        NSString* find=@"gingi";
        // insert code here...
        Bookstore* theBookNook = [[Bookstore alloc] init];
        NSString* newTitle = @"A Farwell To Arms";
        Book* newBook = [[Book alloc] initWithTitle:newTitle author:@"Ernest Hemingway" description:@"The story of an " "affair between an English nurse and an American soldier on the Italian front during World War I." idNumber:3];
        [theBookNook addBook:newBook];
        newTitle =@"gingi";
        [newBook initWithTitle:newTitle author:@"bla bla" description:@"bla bla bla" idNumber:98];
        [newBook release];
        [theBookNook addBook:newBook];
        [theBookNook findBook:find];
        [theBookNook release];

    }
    return 0;
}

我有三个问题:

1:为什么当我添加第二本书并打印所有的书时,我看到的是相同的书?

例如,在这个输入中,输出将会是:

2012-04-10 15:26:45.476 MyBookstore[43574:403]       Title: gingi 
2012-04-10 15:26:45.478 MyBookstore[43574:403]      Author: bla bla 
2012-04-10 15:26:45.478 MyBookstore[43574:403] Description: bla bla bla 
2012-04-10 15:26:45.479 MyBookstore[43574:403] Id number: 98 
2012-04-10 15:26:45.479 MyBookstore[43574:403]       Title: gingi 
2012-04-10 15:26:45.480 MyBookstore[43574:403]      Author: bla bla 
2012-04-10 15:26:45.480 MyBookstore[43574:403] Description: bla bla bla 
2012-04-10 15:26:45.481 MyBookstore[43574:403] Id number: 98

2: 我不明白为什么findBook方法没有起作用? 3: 我想知道是否可以在NSDictionary中找到书籍而不使用键(在我的例子中,键是标题),比如作者或id号码?


主要问题是您正在两次添加相同的书籍对象。您需要两个不同的书籍对象。 - Hot Licks
2个回答

0

在 findBook() 函数内部.. 你正在进行字符串匹配,因此请使用

if ([[myBookStore objectForKey:key] isEqualToString:whatLook] ){

而不是

 if ([myBookStore objectForKey:key]==whatLook ){

0
在添加书籍对象时,请按照以下步骤进行:
Book* newBook = [[Book alloc] initWithTitle:newTitle author:@"Ernest Hemingway" description:@"The story of an " "affair between an English nurse and an American soldier on the Italian front during World War I." idNumber:3]; [theBookNook addBook:newBook]; [newBook release]; newTitle =@"gingi"; newBook = [[Book alloc] initWithTitle:newTitle author:@"bla bla" description:@"bla bla bla" idNumber:98]; [theBookNook addBook:newBook]; [newBook release];
将您的findBook:方法更改如下:
-(BOOL)findBook:(NSString *)whatLook{ Book *book; for (NSString* key in [myBookStore allKeys]) { if ([[myBookStore objectForKey:key] isEqualToString:whatLook] ) { book=[myBookStore objectForKey:key]; NSLog(@" Title: %@ ",book.title); NSLog(@" Author: %@ ",book.author); NSLog(@"Description: %@ ",book.description); NSLog(@"Id number: %d " , book.idNumber); } } }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接