2

質問は以前に尋ねられた多くの質問に似ているかもしれませんが、それらの質問と回答をすべて読んだ後、どうしたらよいか理解できませんでした。

wordNamesと、、wordDefinitionsいくつかIDと。を含むいくつかの単語を書きたいですdate ID。次のコードがありますが、データ型の異なる配列を使用したディクショナリと、ディクショナリのキーを定義する方法について2つの質問があります。

私が作成している.plistファイル全体が間違っている場合は、訂正してください。

前もって感謝します。

- (IBAction)addWord:(id)sender
{
NSString *destinationPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
destinationPath = [destinationPath stringByAppendingPathComponent:@"Box.plist"];

NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath:destinationPath]) 
{
    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"Box" ofType:@"plist"];
    [fileManager copyItemAtPath:sourcePath toPath:destinationPath error:nil];
}

// Load the Property List.  
NSMutableArray* wordsInTheBox = [[NSMutableArray alloc] initWithContentsOfFile:destinationPath];


NSString *wordName = word.name;
NSString *wordDefinition = word.definition;
NSInteger deckID;
NSDate addedDate;


//is this correct to have an array of different types?
NSArray *values = [[NSArray alloc] initWithObjects:wordName, wordDefinition, deckID, addedDate, nil]; 
//How and where am I supposed to define these keys?
NSArray *keys = [[NSArray alloc] initWithObjects: NAME_KEY, DEFINITION_KEY, DECK_ID_KEY, DATE_KEY, nil]; 
NSDictionary *dict = [[NSDictionary alloc] initWithObjects:values forKeys:keys];
[wordsInTheBox addObject:dict];
[wordsInTheBox writeToFile:destinationPath atomically:YES];
}
4

1 に答える 1

3

initWithContentsOfFile:常に不変の配列を返します。あなたはこれをするべきです:

NSMutableArray *wordsInTheBox = [[NSMutableArray alloc] initWithArray:[NSArray arrayWithContentsOfFile:destinationPath]];

私が完全に理解していないのは、word変数がどこで定義されているかです。それはivarですか?

最新バージョンのXcode(4.4または4.5)を使用している場合は、辞書の作成にはるかに単純なリテラルを使用することをお勧めします。

NSDictionary *dict = @{NAME_KEY       : wordName, 
                       DEFINITION_KEY : wordDefinition, 
                       DECK_ID_KEY    : deckID, 
                       DATE_KEY       : addedDate};

しかし、辞書の定義にも問題はありません。動作するはずです。

NAME_KEY、DEFINITION_KEYなどがどこかに定義されていることを確認する必要があります。すべての大文字は通常、プリプロセッサマクロにのみ使用されるため、次のように実行できます。

#define NAME_KEY @"Name"
#define DEFINITION_KEY @"Definition"

辞書で文字列を直接使用することもできます。

NSDictionary *dict = @{@"Name"       : wordName, 
                       @"Definition" : wordDefinition, 
                       @"DeckID"     : deckID, 
                       @"Date"       : addedDate};

しかし、マクロを使用することも悪い考えではありません。

于 2012-09-16T13:46:03.977 に答える