Sobes.tech
Intern

Mit jelent a "másolás szerinti átadás" a programozás kontextusában?

sobes.tech MI

Válasz az MI-től

"Másolás szerinti átadás" (pass-by-value) azt jelenti, hogy egy függvény vagy metódus hívásakor a változó értékének másolatát adjuk át, nem magát a változót. Bármilyen változtatás, amit ezen az argumentumon belül a függvényben/metódusban végzünk, nem befolyásolja az eredeti változót.

Swiftben a struktúrák (structs), az enumerációk (enums) és a tuple-ök (tuples) értéktípusok (value types), és alapértelmezés szerint másolatként kerülnek átadásra. A osztályok (classes), a lezárások (closures) és a függvények referencia típusok (reference types), és referencia szerint kerülnek átadásra.

Swift példák másolat szerinti átadásra:

struct MyStruct {
    var value: Int
}

func modifyStruct(s: MyStruct) {
    var mutableS = s // Másolat készül s-ről
    mutableS.value = 20
    print("modifyStruct belseje: \(mutableS.value)") // 20
}

var originalStruct = MyStruct(value: 10)
print("modifyStruct előtt: \(originalStruct.value)") // 10
modifyStruct(s: originalStruct)
print("modifyStruct után: \(originalStruct.value)") // 10 (az eredeti struktúra nem változott)

Ebben a példában a modifyStruct függvény egy másolatot kap az originalStruct-ről. A mutableS.value módosítása nem befolyásolja az originalStruct.value-t.

Referencia szerinti átadás példája (osztály használatával):

class MyClass {
    var value: Int = 0
}

func modifyClass(c: MyClass) {
    c.value = 20
    print("modifyClass belseje: \(c.value)") // 20
}

var originalClass = MyClass()
originalClass.value = 10
print("modifyClass előtt: \(originalClass.value)") // 10
modifyClass(c: originalClass)
print("modifyClass után: \(originalClass.value)") // 20 (az eredeti osztály módosult)

Itt a modifyClass függvény egy referencia az originalClass-ra. A c.value módosítása ezen a referencián keresztül módosítja az eredeti objektumot.