最基本的例子:
world.tscn(主场景)
extends Node2D
const MYLIST = preload("res://my_list.tscn")
func _ready() -> void:
var my_list = MYLIST.instantiate()
add_child(my_list)
my_list.initialization(["one", "two", "three"])
和 my_list.tscn
extends Node2D
@onready var item_list: ItemList = $ItemList
func initialization(entries: Array[String]):
for entry in entries:
item_list.add_item(entry)
这给了我运行时错误:函数“初始化”中的类型无效。参数 1 的数组(数组)与预期的类型化数组参数的元素类型不同。
我传递给 my_list.initialization 的参数显然是一个 Array[String] 如果我从 func 声明中删除类型提示,它会按预期工作。
有人可以解释一下这里出了什么问题吗?谢谢!
我不知道你使用的是哪个版本的Godot。
我可以看出它是 Godot 4,因为你输入了
Array
s,但细节因版本而异。
如果我没记错的话,在 Godot 4.0 中,这会默默失败(没有错误,但你得到一个空数组),而在 Godot 4.2 之后,它似乎工作正常。因此,可能是 4.1?
Godot 没有类型化
Array
文字(尽管在最近的版本中,它将扫描数组的内容以查找该文字是否与类型化 Array
兼容)。
因此,
Array
给出的["one", "two", "three"]
不是Array[String]
,而只是一个Array
,而你的Godot版本可能不会检查它是否兼容。
所以,除了尝试更新的版本之外。我为您提供了三种可能的解决方法:
将参数恢复为
Array
:
如果您不使用类型化数组
entries: Array
,则不会出现此问题。但是您会丢失类型信息。
在另一行中声明
Array[String]
:
如果您将变量声明为
Array[String]
它可能会起作用:
var tmp:Array[String] = ["one", "two", "three"]
my_list.initialization(tmp)
将参数声明为
PackedStringArray
:
如果你像这样声明参数:
entries: PackedStringArray
,Godot应该能够自动进行转换。 这就是我记得当我遇到问题时所做的。