Using set function for Arrays

Hello! I’m using Godot 4.2,

I want to detect when an array changes so i used this hoping that it works the same way as other variables.

var selectedCards = Array():
	set(newSelectedCards):
		if selectedCards != newSelectedCards:
			emit_signal("CardSelectionChanged")
			print("Selected cards changed = ", newSelectedCards)
			if selectedCards < newSelectedCards:
				emit_signal("CardSelected")
			selectedCards = newSelectedCards

Turns out it doesn’t work because .append() doesn’t trigger the set function.
How can i work around this?

P.S. Pretty please explain to me in simple words i’m not very proficient with technical jargon.

Edit: I found this solution but i suppose it’s considered “janky”.

func _process(delta):
	selectedCardsSize = selectedCards.size()

var selectedCardsSize = 0:
	set(newSelectedCardsSize):
		if selectedCardsSize != newSelectedCardsSize:
			emit_signal("CardSelectionChanged")
			print("Selected cards changed = ", newSelectedCardsSize)
			if selectedCardsSize < newSelectedCardsSize:
				emit_signal("CardSelected")
		selectedCardsSize = newSelectedCardsSize

If it works, then that’s all you need. But you might want something a bit more robust, that will still work when the game is paused.

I would create a custom class extending RefCounted, store the array in the class as a private variable (GDScript doesn’t have true private variables, but you can name it something like _my_array so you know not to access it directly). And then create a custom function for append() and any other manipulation and retrieval functions you need. Then have the class manipulate the array internally and emit a signal.

Objects are a lot slower than arrays, but unless you need to access it hundreds or more times per frame, it shouldn’t have a noticeable impact.

Alternatively, you can do the same thing without a custom class, and just a custom append function in the script the array is stored in. But it can be harder to be disciplined about not accessing it directly without something in the way.

I like your solution, but it doesn’t seem to catch the case when an array is just rearranged as one could do in the inspector, since the size would remain the same.