Может показаться, что вы намереваетесь дать пользователю вашего класса immutable
NSDictionary
, чтобы он не мог модифицировать ивара, который вы используете внутри себя.Судя по тому, что у вас объявлен этот метод
-(void)printInventory;
, я бы предположил, что на самом деле пользователю вашего класса вообще не нужен ивар NSDictionary
.Если это так, то, что я обычно делаю, это не объявляю ivar, который я вообще буду использовать внутри заголовочного файла.Это приводит к тому, что пользователь моего класса использует предоставляемые методы получения / установки, и я могу изменить внутреннюю структуру данных в любое время.Для достижения этого вам нужно будет использовать расширение класса, чтобы добавить дополнительный ivar.
Так ваш класс будет выглядеть следующим образом - обратите внимание, насколько чище выглядит ваш заголовочный файл (публичный API):
// BookStoreMine.h
// BookStore
#import <Cocoa/Cocoa.h>
#import "Book.h"
@interface BookStoreMine : NSObject
- (void)printInventory;
- (BOOL)addBook:(Book *)newBook;
- (BOOL)removeBookWithTitle:(NSString *)whichTitle;
@end
// BookStoreMine.m
// BookStore
#import "BookStoreMine.h"
@interface BookStoreMine ()
@property (retain) NSMutableDictionary* myBookStore;
@end
@implementation BookStoreMine
@synthesize myBookStore;
- (id)init
{
self = [super init];
if (self != nil) {
myBookStore = [[NSMutableDictionary alloc] init];
}
return self;
}
- (BOOL)addBook:(Book *)newBook
{
[self.myBookStore setObject:newBook forKey:newBook.title];
return YES;
}
- (BOOL)removeBookWithTitle:(NSString *)whichTitle
{
if ([myBookStore objectForKey:whichTitle] != nil) {
[self.myBookStore removeObjectForKey:whichTitle];
return YES;
}
return NO;
}
- (void)printInventory
{
Book *book;
for (NSString* key in self.myBookStore) {
book = [myBookStore objectForKey:key];
NSLog(@" Title: %@",book.title);
NSLog(@" Author: %@",book.author);
NSLog(@" Description: %@",book.description);
NSLog(@"ID is:%@",book.ID);
}
}
- (void)dealloc
{
[myBookStore release];
[super dealloc];
}
@end