Junior
Swift-də strukturlar və sinflər arasındakı fərq nədir?
sobes.tech Süni İntellekt
AI-dan cavab
Əsas fərqlər:
- Dəyər tipi vs. Referans tipi: Strukturlar dəyər tipləridir, siniflər referans tipləridir. Bir strukturu təyin etdikdə və ya ona funksiyaya ötürəndə, dəyər kopyalanır. Bir sinifi təyin etdikdə və ya ona funksiyaya ötürəndə, referans yaddaş blokuna kopyalanır.
- Miras: Strukturlar mirası dəstəkləmir. Siniflər mirası dəstəkləyir və obyektlərin hierarxiyalarını yarada bilir.
- Deinitializers: Strukturların deinitializers-i yoxdur. Siniflər resursları sərbəst buraxmaq üçün
deinit-ə sahib ola bilər. - Kimlik bərabərliyi: Strukturlar üçün, bütün xüsusiyyətlərin dəyəri müqayisə olunur (
==ilə). Siniflər üçün,==standart olaraq referansları (kimlik) müqayisə edir. - Performans: Kiçik məlumatlar ilə işləyərkən, strukturlar ümumiyyətlə daha səmərəlidir, çünki onlar dinamik yaddaş ayırması və əlavə referans sayma (ARC) xərcləri olmadan işləyir.
| Kriteriya | Struktur (Struct) | Sinif (Class) |
|---|---|---|
| Tip | Dəyər (Value Type) | Referans (Reference Type) |
| Miras | Yox | Bəli |
| Deinitializers | Yox | Bəli (deinit) |
| Kimlik bərabərliyi | Dəyər əsasında müqayisə | Referans əsasında müqayisə |
| Yerləşmə | Adətən yığın üzərində (yerli dəyişənlər üçün) | Yığın üzərində |
| ARC | Yox | Bəli |
Struktur və sinif arasındakı seçim ehtiyaclara əsaslanır. Struktur, məlumatların modelləşdirilməsi üçün uyğundur, xüsusən də dəyər ötürülməsi vacibdirsə (məsələn, koordinatlar, ölçü). Siniflər, irsi, paylaşılmış dəyişkən referans və ya resursların həyat dövrü idarəçiliyi tələb olunduqda istifadə olunur.
// Struktur nümunəsi
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2, p1-in nüsxəsidir
p2.x = 5.0
// p1.x hələ də 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")
// Sinif nümunəsi
class Circle {
var radius: Double
init(radius: Double) {
self.radius = radius
}
deinit {
print("Circle nümunəsi sərbəst buraxılır.")
}
}
var c1 = Circle(radius: 1.0)
var c2 = c1 // c2, c1 ilə eyni nümunəyə istinad edir
c2.radius = 10.0
// c1.radius də 10.0 olur
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")
// Kimlik müqayisəsi
if c1 === c2 { // Referansları müqayisə edir
print("c1 və c2 eyni Circle nümunəsinə istinad edir.")
} else {
print("c1 və c2 eyni Circle nümunəsinə istinad etmir.")
}
// Dəyərlərin müqayisəsi (struktur üçün)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Bütün xüsusiyyətləri müqayisə edir
print("p1 və p3 eyni dəyərə malikdir.")
} else {
print("p1 və p3 fərqli dəyərə malikdir.")
}