Sobes.tech
Junior

Фарқи байни сохторҳо ва синфҳо дар Swift чист?

sobes.tech AI

Ҷавоб аз AI

Тафовият фарқият:

  • Навъи арзишӣ vs. Навъи истинод: Сохторҳо навъҳои арзишӣ мебошанд, синфҳо навъҳои истинод мебошанд. Вақте ки сохторро таъин мекунем ё ба функсия мефиристем, арзиш нусхабардорӣ мешавад. Вақте ки синфро таъин мекунем ё ба функсия мефиристем, истинод ба блоки ёддошт нусхабардорӣ мешавад.
  • Наследувӣ: Сохторҳо насле надорад. Синфҳо насле доранд, ки имкон медиҳад сохтанҳои объектӣ созанд.
  • Деинициализаторҳо: Сохторҳо деинициализатор надоранд. Синфҳо метавонанд деинициализатор (deinit) дошта бошанд барои озод кардани захираҳо.
  • Баробарии шахсӣ: Барои сохторҳо арзиши ҳамаи хосиятҳояшон муқоиса мешавад (== дар асоси пешфарз). Барои синфҳо == дар асоси пешфарз истинодҳоро муқоиса мекунад (ҳақиқӣ).
  • Камарзиш: Сохторҳо одатан дар кор бо миқдори ками маълумот самараноктаранд, зеро онҳо истифодаи ёдгории динамикӣ дар ёдгории умумӣ намекунанд ва хароҷоти ҳисоб кардани истинодҳоро (ARC) надоранд.
Критерий Сохтор (Struct) Синф (Class)
Навъ Арзишӣ (Value Type) Истинод (Reference Type)
Наследувӣ Надорад Дорад
Деинициализаторҳо Надорад Дорад (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 арзиши гуногун доранд.")
}