Junior
Ի՞նչ է տարբերությունը հղման տեսակների և արժեքի տեսակների միջև։
sobes.tech AI
Պատասխան AI-ից
Հղումը պահում է հիշողության մեջ հասցե, որը ցույց է տալիս այնտեղ պահվող տվյալներին: Իրականում, հղում պահող փոփոխականը միայն այդ հասցեն ունի, ոչ թե տվյալները: Հղման տիպը փոփոխականին վերագրելիս, այն պատճենում է հղումը, ոչ թե տվյալները: Տվյալների փոփոխությունները, որոնց հղումը ցույց է տալիս, արտացոլվում են բոլոր փոփոխականներում, որոնք պահում են այդ հղումը:
Արժեքի տիպը անմիջապես պահում է տվյալները: Արժեքի տիպը փոփոխականին վերագրելիս, այն պատճենում է տվյալները: Արժեքի տիպով փոփոխականում կատարված փոփոխությունները չեն ազդում մյուս փոփոխականների վրա, որոնք ստացել են այդ պատճենը:
| Գծանշում | Հղման տիպ | Արժեքի տիպ |
|---|---|---|
| Պահպանում | Տվյալների հղում | Ինքն տվյալները |
| Վերագրում | Հղման պատճեն | Տվյալների պատճեն |
| Փոփոխություն | Կազդում է բոլոր հղումներին | Չազդում է պատճեններին |
| Տեղադրում | Heap-ում | 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