2014-10-17 87 views
2

我使用下面的代碼來讀取plist中我的遊戲數據:Cocos2D X:如何檢查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

因爲ValueMap是一個std :: unordered_map,您可以使用從類中的方法:ValueMap的在cocos2d-x

if (mapFile.count(strLevel).count() > 0) { 
    ValueMap mapLevel = mapFile.at(strLevel).asValueMap(); 
} 

宣言:

typedef std::unordered_map<std::string, Value> ValueMap; 
0

您也可以使用find方法,如果找不到密鑰,它將返回一個迭代器到關鍵元素對或過去結束迭代器。

auto it = mapFile.find(strLevel); 

if (it != mapFile.end()) { 
    it->first; //key 
    it->second; //element 
} 
else { 
    //key not found 
} 
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(); 
} 

你也可以查看針對 「CCValue.h」 定義,如特定類型:

Value::Type::MAP 
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 
    }