Godot中返回Dictionary的自定义函数为何返回Nil?
问题分析与修复方案
你遇到的问题是getItem函数看似每个分支都有返回值,但实际调用后返回Nil,导致后续调用get方法触发Invalid call. Nonexistent function 'get' in base 'Nil'错误。以下是具体的排查方向和修复建议:
可能的问题根源
1. is_name_in_inventory逻辑错误
如果这个函数错误返回true,但inventory.item1到item4中没有匹配itemName的项,会进入第一个if块但所有elif都不命中,理论上会走到Unknown error分支返回字典,但如果函数在这之前因为其他错误提前终止(比如访问Nil对象的属性),就会返回Nil。
2. inventory.itemX为Nil或非字典类型
- 若
inventory.item1是Nil,访问inventory.item1.name会直接触发运行时错误,导致函数无返回值退出(即返回Nil)。 - 若
inventory.itemX不是Dictionary类型,调用merge方法会失败,可能返回Nil(只有原生Dictionary才有merge方法,自定义类需自行实现并确保返回字典)。
3. merge方法返回Nil
如果inventory.itemX.merge()的实现存在问题,没有正确返回合并后的字典,那对应的return语句就会返回Nil。
修复步骤
添加Nil检查,避免属性访问错误
修改函数,在访问itemX.name前先确认对象不为Nil:func getItem(itemName:String) -> Dictionary: if is_name_in_inventory(itemName): if inventory.item1 != null and inventory.item1.name == itemName: return inventory.item1.merge({"index": 1, "error": false}) elif inventory.item2 != null and inventory.item2.name == itemName: return inventory.item2.merge({"index": 2, "error": false}) elif inventory.item3 != null and inventory.item3.name == itemName: return inventory.item3.merge({"index": 3, "error": false}) elif inventory.item4 != null and inventory.item4.name == itemName: return inventory.item4.merge({"index": 4, "error": false}) print("Unknown error finding an inventory item...") return {"error": true, "errormessage": "Item not found in inventory slots"} print("That name does not exist!") return {"error": true, "errormessage": "That name does not exist!"}验证
is_name_in_inventory的逻辑一致性
确保该函数的判断规则和后续itemX.name的匹配规则完全一致(比如是否区分大小写、是否处理空格或特殊字符),避免出现“函数认为存在,但实际找不到对应项”的情况。检查
merge方法的有效性- 如果
inventory.itemX是原生Dictionary,可以单独测试merge的返回值:var test_merge = inventory.item1.merge({"index":1, "error":false}) print("Merge result: ", test_merge) - 如果是自定义类,确认
merge方法正确实现,且返回的是Dictionary类型而非Nil。
- 如果
调用时增加Nil防护
暂时在调用处增加判断,避免直接在Nil上调用方法:var item_data = getItem("item") var error_status = item_data != null ? item_data.get("error", false) : true
内容的提问来源于stack exchange,提问作者funfoxrr
相关产品推荐
相关产品推荐

