Sobes.tech
Junior

რა განსხვავებაა მიმთითებელ ტიპებსა და მნიშვნელობის ტიპებს შორის?

sobes.tech AI

პასუხი AI-სგან

ლინკი ინახავს მეხსიერებაში მისამართს, რომელიც მიუთითებს იქ განთავსებულ მონაცემებზე. ფაქტობრივად, ცვლადი, რომელიც ინახავს ლინკს, ფლობს მხოლოდ ამ მისამართს, არა თავად მონაცემებს. ლინკის ტიპის ცვლადს გადაცემისას, ის კოპირებს ლინკს, არა მონაცემებს. მონაცემებზე ცვლილებები, რომლებიც ლინკს მიუთითებს, აისახება ყველა ცვლადზე, რომელიც ამ ლინკს ინახავს.

მნიშვნელობის ტიპი ინახავს პირდაპირ მონაცემებს. მნიშვნელობის ტიპის ცვლადს გადაცემისას, ის კოპირებს მონაცემებს. ცვლილებები ერთეულ მნიშვნელობის ტიპის ცვლადში არ ზეგავლენენ სხვა ცვლადებზე, რომლებმაც მიიღეს ეს კოპია.

ნიშნული ლინკის ტიპი მნიშვნელობის ტიპი
შენახვა მონაცემის ლინკი თავად მონაცემები
გადაცემა ლინკის კოპირება მონაცემების კოპირება
ცვლილება ზეგავლენას ახდენს ყველა ლინკზე არ ზეგავლენას ახდენს კოპიებზე
განთავსება heap-ში (Heap) stack-ში (Stack)
გათავისუფლება ARC / მტვრის შეგროვება ავტომატურად, როდესაც გამოდის სქოპიდან
Swift-ის მაგალითები class, closure struct, enum, tuple, ძირითადი ტიპები (Int, Bool, String და ა.შ.)
// ლინკის ტიპის მაგალითი (კლასი)
class ReferenceType {
    var value: Int
    init(value: Int) {
        self.value = value
    }
}

let ref1 = ReferenceType(value: 10)
let ref2 = ref1 // კოპირდება ლინკი
ref2.value = 20 // მონაცემები იცვლება, როგორც ref1, ასევე ref2-ზე
print(ref1.value) // გამოტანა: 20
print(ref2.value) // გამოტანა: 20

// მნიშვნელობის ტიპის მაგალითი (სტრუქტურა)
struct ValueType {
    var value: Int
}

var val1 = ValueType(value: 10)
var val2 = val1 // კოპირდება მონაცემები
val2.value = 20 // იცვლება მხოლოდ val2-ის მონაცემები
print(val1.value) // გამოტანა: 10
print(val2.value) // გამოტანა: 20