Sobes.tech
Junior

Swift-ში სტრუქტურებსა და კლასებს შორის რა განსხვავებაა?

sobes.tech AI

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

Негизги айырмачылыктар:

  • Мааниси боюнча түрү vs. шилтемеси боюнча түрү: Структуралар мааниси боюнча түрлөр, класстар шилтемеси боюнча түрлөр. Структураны белгилөө же функцияга өткөрүп берүүдө мааниси көчүрүлөт. Класс белгилөө же функцияга өткөрүп берүүдө шилтемеси көчүрүлөт, ал эс тутум блокуна шилтеме.
  • Наследование: Структуралар мурас алууну колдобойт. Класстар мурас алууга мүмкүндүк берет, бул объекттердин хиерархияларын түзүүгө мүмкүндүк берет.
  • Деинициализаторлор: Структуралар деинициализаторлорго ээ эмес. Класстарда 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 объектиси деинициализацияланууда.")
    }
}

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 айырмаланат.")
}