Cocos2D X:如何检查plist文件是否存在密钥?

时间:2014-10-17 11:33:57

标签: c++ ios cocos2d-x cocos2d-x-3.0

我正在使用以下代码从我的游戏的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的键是否存在的正确方法是什么?

4 个答案:

答案 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
    }