Junior
Swiftте маалыматтын түрлөрү кайда сакталат?
sobes.tech AI
AIден жооп
Swiftтеги маалыматтар эки негизги эс тутум аймактарында сакталат: стек жана куче.
Стек
- Маанилүү түрлөр (Value types):
struct(структуралар)enum(элементтер)Int,Double,Bool,Stringсыяктуу негизги түрлөр (кыска саптар оптимизация үчүн түз эле стекте сакталат)
- Маалыматтар түздөн-түз стекте аткаруу тартибинде сакталат.
- Эс тутуму автоматтык түрдө жана тез (LIFO - Last In, First Out) бөлүп берет жана бошотот.
Куче
- Байланыштуу түрлөр (Reference types):
class(кластар)- Функциялар жана жабдыктар (Closures)
- Объекттер (
AnyObject)
- Объекттер кучеде сакталат, ал эми стекте — алардын шилтемелери.
- Эс тутуму динамикалык бөлүп берет жана автоматтык түрдө башкарылат (Automatic Reference Counting - ARC).
- Кучедеги маалыматка жетүү косвенный, көрсөткүч аркылуу.
Өзгөчөлүктөр
- Маанилүү түрлөрдү менчикке алуу учурда бүт маанини көчүрөт.
- Байланыштуу түрлөрдү менчикке алуу учурда гана шилтемени көчүрөт, эки объект бир эле эс тутум бөлүгүнө көрсөтөт.
- ARC кучедеги күчтүү шилтемелердин санын көзөмөлдөйт жана шилтемелер калганда автоматтык түрдө бошотот.
// Мисал маанилүү түр - стекте сакталат
struct Point {
var x: Int
var y: Int
}
var p1 = Point(x: 10, y: 20)
var p2 = p1 // Бардык мааниси көчүрүлөт
p2.x = 30 // p1 өзгөрбөйт
print("p1: \(p1), p2: \(p2)") // Output: p1: Point(x: 10, y: 20), p2: Point(x: 30, y: 20)
// Байланыштуу түрдүн мисалы - кучеде сакталат
class Circle {
var radius: Double
init(radius: Double) {
self.radius = radius
}
}
var c1 = Circle(radius: 5.0)
var c2 = c1 // Жай гана шилтеме көчүрүлөт
c2.radius = 10.0 // c1 да өзгөрөт, анткени экөө бир эле объектке көрсөтөт
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)") // Output: c1.radius: 10.0, c2.radius: 10.0