Sobes.tech
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