Junior
Ի՞նչ է տարբերությունը հղման տեսակների և արժեքի տեսակների միջև։
sobes.tech AI
Պատասխան AI-ից
Արժեքի տեսակները (Value Types) պատկանելության կամ փոխանցման ժամանակ պատճենվում են: Յուրաքանչյուր օրինակ ունի իր սեփական տվյալների պատճենը:
Հղման տեսակները (Reference Types) պատկանելության կամ փոխանցման ժամանակ փոխանցում են նույն տվյալների օրինակին հղում: Փոփոխությունները մեկ հղումով կանդրադառնան բոլոր մյուս հղումներին, որոնք հղում են նույն օրինակին:
| Գծագիր | Արժեքի տեսակ (Value Type) | Հղման տեսակ (Reference Type) |
|---|---|---|
| Վարվելաձև փոխանցման/տվյալի | Նույնականացում | Հղում փոխանցում |
| Հիշողության տեղադրումը | Stack (Heap) | Heap (Stack) |
| Հիշողության կառավարում | Ավտոմատ (stack-ի միջոցով) | Ավտոմատ (ARC) |
| Swift-ում օրինակներ | struct, enum, tuple |
class, func, closure |
// Արժեքի տեսակ օրինակ (Struct)
struct Point {
var x: Int
var y: Int
}
var p1 = Point(x: 1, y: 2)
var p2 = p1 // p2 ստանում է p1-ի պատճենը
p2.x = 10 // p2-ում փոփոխությունը չի ազդում p1-ի վրա
print("p1: \(p1)") // p1: Point(x: 1, y: 2)
print("p2: \(p2)") // p2: Point(x: 10, y: 2)
// Հղման տեսակ օրինակ (Կլաս)
class Coordinate {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
var c1 = Coordinate(x: 1, y: 2)
var c2 = c1 // c2 հղում է նույն օբյեկտին, ինչ c1
c2.x = 10 // Փոփոխությունը c2-ում ազդում է c1-ի վրա, քանի որ երկուսը հղում են նույն օբյեկտին
print("c1: \(c1.x)") // c1: 10
print("c2: \(c2.x)") // c2: 10