Junior
Ի՞նչ է Swift-ում կառուցվածքների և դասերի միջև տարբերությունը։
sobes.tech AI
Պատասխան AI-ից
Հիմնական տարբերությունները՝
- Արժեքի տեսակ vs. Հղման տեսակ: Կառուցվածքները արժեքի տեսակներ են, դասերը՝ հղման տեսակներ։ Երբ մենք նշանակում ենք կառուցվածք կամ փոխանցում այն ֆունկցիային, կատարվում է արժեքի պատճենում։ Երբ մենք նշանակում ենք դաս կամ փոխանցում այն ֆունկցիային, կատարվում է հղման պատճենում՝ դեպի հիշողության բլոկը։
- Ներառում: Կառուցվածքները չեն աջակցում ժառանգությանը։ Դասերը աջակցում են ժառանգությանը՝ թույլ տալով օբյեկտների հիերարխիաներ ստեղծել։
- Deinitializers: Կառուցվածքներին չեն տրամադրվում deinitializers։ Դասերը կարող են ունենալ deinitializer (
deinit)՝ ռեսուրսների ազատման համար։ - Անհատականության հավասարություն: Կառուցվածքների դեպքում համեմատվում է բոլոր հատկությունների արժեքը (
==ըստ նախնական կարգավորումների): Դասերի դեպքում==համեմատում է հղումները (հատկանիշը): - Արդյունավետություն: Կառուցվածքները սովորաբար ավելի արդյունավետ են փոքր տվյալների դեպքում, քանի որ չեն օգտագործում դինամիկ հիշողության բաշխում հողամասում և չունեն հղումների հաշվարկման ավելորդ ծախսեր (ARC):
| Կատեգորիա | Կառուցվածք (Struct) | Դաս (Class) |
|---|---|---|
| Տիպ | Արժեքային (Value Type) | Հղման (Reference Type) |
| ժառանգություն | Չի աջակցում | Աջակցում է |
| Deinitializers | Չի աջակցում | Աջակցում է (deinit) |
| Անհատականության հավասարություն | Արժեքի համեմատություն | Հղումների համեմատություն |
| Տեղադրություն | Սովորաբար ստեկ (տեղական փոփոխականների համար) | Հողամաս (heap) |
| ARC | Չի աջակցում | Աջակցում է |
Ընտրությունը կառուցվածք կամ դաս ընտրելու՝ կախված է անհրաժեշտություններից։ Կառուցվածքները լավ են տվյալների մոդելավորման համար, որտեղ կարևոր է արժեքի փոխանցումը (օրինակ՝ կոորդինատներ, չափսեր): Դասերը օգտագործվում են, երբ անհրաժեշտ է ժառանգություն, ընդհանուր փոփոխական հղում կամ ռեսուրսի կյանքի ցիկլի կառավարում։
// Կառուցվածքի օրինակ
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2 պատճենն է p1-ի
p2.x = 5.0
// p1.x դեռևս 0.0 է
print("p1.x: \(p1.x), p2.x: \(p2.x)")
// Դասի օրինակ
class Circle {
var radius: Double
init(radius: Double) {
self.radius = radius
}
deinit {
print("Circle օբյեկտը deinitializes է։")
}
}
var c1 = Circle(radius: 1.0)
var c2 = c1 // c2 հղում է նույն օբյեկտին, ինչ c1
c2.radius = 10.0
// c1.radius նույնպես դառնում է 10.0
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")
// Անհատականության համեմատություն
if c1 === c2 { // Հղումների համեմատություն
print("c1 և c2 հղում են նույն Circle օբյեկտին։")
} else {
print("c1 և c2 չեն հղում նույն Circle օբյեկտին։")
}
// Արժեքների համեմատություն (ստրուկտուրների համար)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Համեմատում է բոլոր հատկությունների արժեքները
print("p1 և p3 ունեն նույն արժեքը։")
} else {
print("p1 և p3 ունեն տարբեր արժեքներ։")
}