簡體   English   中英

如何在其他方法中訪問字典?

[英]How to access dictionaries within other methods?

下面是我用來嘗試通過另一種方法訪問初始化字典的代碼:

#import "UserFoodData.h"

@implementation UserFoodData

-(void)loadUserFoodData{
    NSString *appDataPath = [[NSBundle mainBundle] pathForResource:@"UserFoodData"     ofType:@"plist"];
    NSMutableDictionary *userFoodDictionary = [[NSMutableDictionary alloc]     initWithContentsOfFile:appDataPath];

    for (userFoodDictionary in userFoodDictionary){
        NSLog(@"%@", userFoodDictionary);
    }

}

-(void)setName:(NSString *)foodName andCarbs:(NSNumber *)carbAmount{
    [userFoodDictionary setObject:foodName forKey:foodName];

}

@end

我似乎收到的錯誤消息是:使用未聲明的標識符'userFoodDictionary'

現在我認為是錯誤的,因為編譯器認為setName:andCarbs方法有可能只能在初始化應用程序主屏幕時調用的loadUserFoodData之前執行。 有人可以幫我解決問題嗎?

我似乎收到的錯誤消息是:

使用未聲明的標識符“ userFoodDictionary”

編譯器說:

1.我沒有在本地看到任何變量,例如userFoodDictionary或-(void)setName:(NSString *)foodName和Carbs:(NSNumber *)carbAmount中的實例變量。

2.但是您正在嘗試訪問它。

 and also your for loop has mistakes. please verify my answer

編譯器正在嘗試在“ UserFoodData”類中查找userFoodDictionary。 因為您要在loadUserFoodData方法之外訪問userFoodDictionary。 因此,為了訪問本地方法之外的內容,必須將該引用保留在頭文件中,然后可以在類中的任何位置訪問它。

@interface UserFoodData : NSObject

@property(nonatomic,retain)NSMutableDictionary *userFoodDictionary;

@end

#import "UserFoodData.h"

@implementation UserFoodData
//@synthesize userFoodDictionary; synthesise is automatically entered by compiler

-(void)loadUserFoodData{
    NSString *appDataPath = [[NSBundle mainBundle] pathForResource:@"UserFoodData"     ofType:@"plist"];

    self.userFoodDictionary = [[NSMutableDictionary alloc]     initWithContentsOfFile:appDataPath];

//Please not down this
    for (id aFood in userFoodDictionary){
        NSLog(@"%@", aFood);
    }

}

-(void)setName:(NSString *)foodName andCarbs:(NSNumber *)carbAmount{
    [self.userFoodDictionary setObject:foodName forKey:foodName];

}

@end

我假設您在發布的第二種方法中遇到了錯誤。

- (void)setName:(NSString *)foodName andCarbs:(NSNumber *)carbAmount{
    [userFoodDictionary setObject:foodName forKey:foodName];
}

該方法未定義userFoodDicitionary 如果您希望字典在方法調用之間持久存在,請將其存儲在@property

您應該真正閱讀了Objective-C的入門資料,您可以從這份Apple文檔開始

這里有多個問題...

一方面,您的for循環有一個語法錯誤……不僅如此,而且您正嘗試通過一個名為userFoodDictionary的字典進行迭代, userFoodDictionary使用一個迭代器變量也稱為userFoodDictionary 更改為類似:

for (id dictKey in userFoodDictionary) {
    NSLog(@"%@", dictKey);
}

您還試圖訪問超出范圍的變量。 userFoodDictionaryloadUserFoodData的范圍內聲明。 該方法完成后,將釋放該變量,因此您當然不能在setName:andCarbs:訪問它。 為此,您需要在更廣泛的范圍內進行定義-創建屬性,靜態變量,iVar等。

這里缺少許多OOP概念...如果您是編程的新手,那么Objective-C是一個很難入門的地方,它可能會使您陷入很多循環(雙關語)。

嘗試這個...

#import "UserFoodData.h"

@implementation UserFoodData

-(void)loadUserFoodData{
    NSString *appDataPath = [[NSBundle mainBundle] pathForResource:@"UserFoodData"     ofType:@"plist"];
    NSMutableDictionary *userFoodDictionary = [[NSMutableDictionary alloc]     initWithContentsOfFile:appDataPath];

    for (userFoodDictionary in userFoodDictionary){
        NSLog(@"%@", userFoodDictionary);
    }

}

-(void)setName:(NSString *)foodName andCarbs:(NSNumber *)carbAmount{
    NSString *appDataPath = [[NSBundle mainBundle] pathForResource:@"UserFoodData"     ofType:@"plist"];
    NSMutableDictionary *userFoodDictionary = [[NSMutableDictionary alloc]     initWithContentsOfFile:appDataPath];
    [userFoodDictionary setObject:foodName forKey:foodName];
}

@結束

讓我知道是否有幫助... :)

我認為問題是您的NSMutableDictionary應該是在.h中聲明為NSMutableDictionary的ivar,如下所示

NSMutableDictionary *userFoodDictionary

在.m中

-(void)loadUserFoodData{
    NSString *appDataPath = [[NSBundle mainBundle] pathForResource:@"UserFoodData"     ofType:@"plist"];
    userFoodDictionary = [[NSMutableDictionary alloc]     initWithContentsOfFile:appDataPath];

for (userFoodDictionary in userFoodDictionary){
    NSLog(@"%@", userFoodDictionary);
}

}
-(void)setName:(NSString *)foodName andCarbs:(NSNumber *)carbAmount{
    [userFoodDictionary setObject:foodName forKey:foodName];

}

所以問題在下面的行中

for (userFoodDictionary in userFoodDictionary){
    NSLog(@"%@", userFoodDictionary);
}

替換為

for (NSMutableDictionary *userFoodDic in userFoodDictionary){
    NSLog(@"%@", userFoodDic);
}

可以解決您的問題

好,也有其他問題

請也將userFoodDictionary聲明為屬性之一,如@Sebastian在其回答中所述:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM