Sobes.tech
Intern

Ի՞նչ է նշանակում «կատարման փոխանցում» ծրագրավորման համատեքստում։

sobes.tech AI

Պատասխան AI-ից

"Նախագծում ըստ արժեքի" (pass-by-value) նշանակում է, որ ֆունկցիա կամ մեթոդ կանչելիս փոխանցվում է փոփոխականի արժեքի պատճենը, ոչ թե ինքն փոփոխականը։ Յուրաքանչյուր փոփոխության փոփոխություն, որը կատարվում է այդ արգումենտում ֆունկցիայի կամ մեթոդի ներսում, չի ազդում սկզբնական փոփոխականի վրա։

Swift-ում կառուցվածքները (structs), enum-ները (enums) և tuples-ները (tuples) արժեքային տիպեր են (value types) և ըստ նախնական կարգի փոխանցվում են պատճենով։ Կլասները (classes), closures-ները (closures) և ֆունկցիաները ռեֆերենցիոն տիպեր են (reference types) և փոխանցվում են ռեֆերենցիայով։

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 (մասը փոփոխված չէ)

Այս օրինակով, modifyStruct ֆունկցիան ստանում է originalStruct-ի պատճենը։ Փոփոխությունը mutableS.value-ում ներսում ֆունկցիայի, չի ազդում originalStruct.value-ի վրա։

Համեմատության համար՝ ռեֆերենցիոն փոխանցում (կլաս օգտագործելով):

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-ում այս հղումով, փոխում է սկզբնական օբյեկտը։