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