Sobes.tech
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 ունեն տարբեր արժեքներ։")
}