我正在使用以下代码从我的游戏的plist中读取数据:
int levelNum = SOME_VALUE_FROM_OUTSIDE;
ValueMap mapFile = FileUtils::getInstance()->getValueMapFromFile("LevelDetails.plist");
std::string strLevel = std::to_string(levelNum);
ValueMap mapLevel = mapFile.at(strLevel).asValueMap();
LevelDetails.plist是一个以字典为根的plist。问题是可能存在没有名为levelNum / strLevel的键的情况。因此,在运行此行之前,我必须检查密钥是否存在:
ValueMap mapLevel = mapFile.at(strLevel).asValueMap(); //Throws exception occasionally
那么检查名为levelNum / strLevel的键是否存在的正确方法是什么?
答案 0 :(得分:0)
因为ValueMap是一个std :: unordered_map,所以你可以使用该类中的方法:
if (mapFile.count(strLevel).count() > 0) {
ValueMap mapLevel = mapFile.at(strLevel).asValueMap();
}
cocos2d-x中的ValueMap声明是:
typedef std::unordered_map<std::string, Value> ValueMap;
答案 1 :(得分:0)
你也可以使用find
方法,如果找不到密钥,它会将一个迭代器返回到键元素对或者一个过去的迭代器。
auto it = mapFile.find(strLevel);
if (it != mapFile.end()) {
it->first; //key
it->second; //element
}
else {
//key not found
}
答案 2 :(得分:0)
我出于类似的原因遇到了这个问题,并认为我找到了一个合适的解决方案,使用 cocos2d-x-3.11.1 (也应该适用于旧版本)。
if( mapFile.at(strLevel).getType() != Value::Type::NONE ){
//OR if( mapFile[strLevel].getType() != Value::Type::NONE ) {
//if reached here then the 'key exists', thus perform desired line.
ValueMap mapLevel = mapFile.at(strLevel).asValueMap();
}
您还可以检查&#34; CCValue.h&#34;中定义的特定类型。如:
Value::Type::MAP
答案 3 :(得分:0)
我们使用的是:
string fullPath = cocos2d::FileUtils::getInstance()->fullPathForFilename("file.plist");
auto dataFromPlist = cocos2d::FileUtils::getInstance()->getValueMapFromFile(fullPath);
if (!dataFromPlist["key1"].isNull())
{
auto map = dataFromPlist["key1"].asValueMap();
//Do something else
}