Sobes.tech
Intern

Τι σημαίνει "μεταβίβαση με αντίγραφο" στο πλαίσιο του προγραμματισμού;

sobes.tech AI

Απάντηση από AI

"Pass-by-value" σημαίνει ότι κατά την κλήση μιας συνάρτησης ή μεθόδου, περνάει ένα αντίγραφο της τιμής της μεταβλητής, και όχι η ίδια η μεταβλητή. Οποιαδήποτε αλλαγή γίνει σε αυτό το όρισμα μέσα στη συνάρτηση/μέθοδο δεν επηρεάζει την αρχική μεταβλητή.

Στη Swift, οι δομές (structs), οι enum (enums) και οι πλειάδες (tuples) είναι τύποι τιμών (value types) και, κατά κανόνα, περνιούνται με αντίγραφο. Οι κλάσεις (classes), οι κλεισίματα (closures) και οι συναρτήσεις είναι τύποι αναφοράς (reference types) και περνιούνται με αναφορά.

Παράδειγμα pass-by-value στη Swift:

struct MyStruct {
    var value: Int
}

func modifyStruct(s: MyStruct) {
    var mutableS = s // Δημιουργείται ένα αντίγραφο του s
    mutableS.value = 20
    print("Μέσα στη modifyStruct: \(mutableS.value)") // 20
}

var originalStruct = MyStruct(value: 10)
print("Πριν από τη modifyStruct: \(originalStruct.value)") // 10
modifyStruct(s: originalStruct)
print("Μετά τη modifyStruct: \(originalStruct.value)") // 10 (το αρχικό struct δεν άλλαξε)

Σε αυτό το παράδειγμα, η συνάρτηση modifyStruct λαμβάνει ένα αντίγραφο του originalStruct. Η αλλαγή του mutableS.value μέσα στη συνάρτηση δεν επηρεάζει το originalStruct.value.

Παράδειγμα pass-by-reference (με κλάση):

class MyClass {
    var value: Int = 0
}

func modifyClass(c: MyClass) {
    c.value = 20
    print("Μέσα στη modifyClass: \(c.value)") // 20
}

var originalClass = MyClass()
originalClass.value = 10
print("Πριν από τη modifyClass: \(originalClass.value)") // 10
modifyClass(c: originalClass)
print("Μετά τη modifyClass: \(originalClass.value)") // 20 (το αρχικό αντικείμενο άλλαξε)

Εδώ, η συνάρτηση modifyClass λαμβάνει μια αναφορά στο αντικείμενο originalClass. Η αλλαγή του c.value μέσω αυτής της αναφοράς αλλάζει το αρχικό αντικείμενο.