Struct — Swift dilində tip-dəyər (value type) olub, nüsxələri kod hissələri arasında ötürülərkən surəti çıxarılır. Siniflərdən fərqli olaraq, strukturlar miras almır, lakin protokolları tətbiq edir, xassə və metodları ehtiva edir və ARC olmadan proqnozlaşdırılan yaddaş idarəetməsini təmin edir. Swift Programming Language Guide, 2026-ya görə, struct Swift-in əsas tikinti blokudur — hətta standart Int, String, Array və Dictionary tipləri strukturlar kimi tətbiq edilmişdir. Dil məlumatların modelləşdirilməsi üçün strukturları prioritet seçim kimi tövsiyə edir.
Əsas məqamlar
Struct (struktur) — Swift-də əlaqəli xassə və metodları vahid varlıqda qruplaşdıran mürəkkəb məlumat tipidir. Siniflərdən fərqli olaraq, strukturlar value types-dır: funksiyaya ötürüldükdə və ya yeni dəyişənə mənimsədildikdə orijinal obyektə referans deyil, strukturun müstəqil surəti yaradılır.
Swift bütün primitiv tiplər üçün strukturlardan istifadə edir: Int, Double, String, Bool, Array, Dictionary və Set. Bu o deməkdir ki, hətta əsas Int ədədi də struktur kimi davranır — mənimsətmə zamanı surət yaradılır. Tərtibatçı ixtiyari xassə və metod dəsti ilə öz strukturunu təyin edə bilər.
Swift Evolution (SE-0143)-ə görə, standart tiplərin strukturlar kimi tətbiq edilməsi qərarı performans və proqnozlaşdırıla bilmə ilə əsaslandırılmışdır. Value types referans dövrləri yaratmır, ARC referans sayılmasını tələb etmir və surətin dəyişdirilməsinin orijinala təsir etməyəcəyinə zəmanət verir — bu, çoxiplikli ssenarilərdə məlumatların dəyişməzliyi üçün kritik əhəmiyyət daşıyır.
Value type semantics — struct ilə class arasındakı əsas fərqdir. Bir strukturu yeni dəyişənə mənimsədikdə və ya funksiyaya ötürdükdə, Swift bütün məlumatların müstəqil surətini yaradır. Surətdə edilən hər hansı dəyişiklik orijinala təsir etmir ki, bu da referans tipləri üçün xarakterik olan yan təsirləri aradan qaldırır.
// Value type semantikası nümunəsi
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 10, y: 20)
var p2 = p1 // p2 p1-in müstəqil surətidir
p2.x = 99 // Yalnız p2 dəyişir
print(p1.x) // 10 — p1 dəyişməz
print(p2.x) // 99
Swift surətin çıxarılmasını optimallaşdırmaq üçün Copy-on-Write (COW) istifadə edir. Bir neçə dəyişən bir struktura istinad edirsə, lakin heç biri məlumatları dəyişdirmirsə, faktiki surət çıxarma baş vermir. Swift ilk mutasiyaya qədər dəyişənlər arasında yaddaşı paylaşır — bundan sonra həqiqi surət yaradılır. Bu, lazımsız ayırma əməliyyatlarının qarşısını alır və kolleksiyalarla işi sürətləndirir.
Susmaya görə, struktur metodları onun xassələrini dəyişə bilməz — Swift dəyişiklik edən metodlar üçün açıq şəkildə mutating göstərilməsini tələb edir. Bu məhdudiyyət təsadüfi mutasiyadan qoruyur və kodu proqnozlaşdırılan edir: metod mutating kimi qeyd edilməyibsə, strukturu dəyişməyəcəyinizə zəmanət verilir.
Metoddan əvvəl mutating açar sözünü əlavə etdikdə, Swift strukturun xassələrinə yeni dəyərlər yazmaq imkanı əldə edir. Əslində, metod hətta self = vasitəsilə struktur nümunəsini tamamilə yenisi ilə əvəz edə bilər. Bu mexanizm, məsələn, Option və Result tiplərində istifadə olunur.
// Mutating metodu olan struct
struct Counter {
private var value: Int = 0
// Mutating metodu — xassələri dəyişə bilər
mutating func increment() {
value += 1
}
// Mutating metodu self-i tamamilə əvəz edə bilər
mutating func reset() {
self = Counter()
}
// Non-mutating metodu — yalnız oxumaq üçün
func currentValue() -> Int {
return value
}
}
var counter = Counter()
counter.increment()
print(counter.currentValue()) // 1
counter.reset()
print(counter.currentValue()) // 0
Mutating qaydaları: struktur var ilə elan edilməlidir, let ilə yox — sabit strukturda mutating metodu çağırmaq olmaz. Kompilyator bunu qurma mərhələsində yoxlayır: let sabitində mutating metodu çağırmaq cəhdi kompilyasiya xətasına səbəb olacaq.
Struct və class arasında seçim — Swift-də əsas qərarlardan biridir. Hər iki tip xassələr, metodlar, başlatıcılar ehtiva edə və protokolları tətbiq edə bilər, lakin yaddaş semantikası, miras və həyat dövrü idarəetməsində prinsipial fərqlərə malikdir.
| Xüsusiyyət | struct | class |
|---|---|---|
| Tip | Value type (surəti çıxarılır) | Reference type (referans) |
| Miras | Dəstəkləmir | Dəstəkləyir |
| ARC / referans sayılması | Tələb olunmur | ARC tələb olunur |
| Deinitializasiya | Dəstəkləmir | deinit dəstəkləyir |
| Sabitdə xassələrin dəyişdirilməsi | Yalnız var vasitəsilə | let vasitəsilə mümkündür (referans sabitdir) |
| Tip yönləndirmə | Dəstəkləmir | Dəstəkləyir |
| Kolleksiyalarda saxlanma | Birbaşa saxlanılır (dəyər) | Referans kimi saxlanılır (göstərici) |
Strukturlar məlumatlar miras tələb etmədikdə, ümumi eyniliyə malik olmamalı olduqda (məsələn, koordinatlar, ölçülər, konfiqurasiya) və modullar arasında ötürüldükdə üstünlük təşkil edir. Siniflər UI komponentləri (UIView, UIViewController), singleton və ümumi eyniliyə malik obyektlər üçün seçilir.
Apple Swift-də məlumatların modelləşdirilməsi üçün struct-dan susmaya görə tip kimi istifadə etməyi tövsiyə edir. Strukturlar proqnozlaşdırılan surət çıxarma semantikası və referans sayılmasına əlavə yükün olmaması sayəsində əksər ssenarilər üçün uyğundur. Tipik halları nəzərdən keçirək.
Əgər varlıq miras ehtiyacı olmadan məlumat ehtiva edirsə (Product, User, Order, Point), struct istifadə edin. Kompilyator avtomatik olaraq memberwise initializer yaradır — init-i əl ilə yazmağa ehtiyac yoxdur. Equatable və Hashable da bütün xassələri bu protokollara uyğun gələn strukturlar üçün avtomatik tətbiq edilir.
Yaradıldıqdan sonra dəyişməyən konfiqurasiyalar, parametrlər və bayraqlar üçün struct class-dan daha üstündür. Sabit (let) struktur bütün iç-içə sahələrin dəyişməzliyinə zəmanət verir — class-da bu yalnız referansa aiddir, obyektin məzmununa deyil.
Strukturlar value semantics sayəsində çoxiplikli mühitdə təhlükəsizdir. Hər bir axın müstəqil məlumat surəti alır və digər axınlara təsir etmir. Value types üçün axınlar arasında məlumat yarışı mümkün deyil, bu da struct-u SwiftUI-də modellər üçün üstün seçim edir (ObservableObject class tələb edir, lakin @State struct istifadə edir).
// Struct-ın məlumat modeli üçün istifadəsi nümunəsi
struct User: Codable, Identifiable {
let id: UUID
var name: String
var email: String
var isPremium: Bool
// Computed xassə — non-mutating
var displayName: String {
isPremium ? "\(name) ⭐️" : name
}
}
// Avtomatik memberwise başlatıcı
let user = User(
id: UUID(),
name: "Alice",
email: "alice@example.com",
isPremium: true
)
// Kopyalama çoxipliklik üçün təhlükəsizdir
var userCopy = user
userCopy.isPremium = false
// user.isPremium true olaraq qalır
Class-dan miras (UIKit/AppKit komponentləri), ümumi eynilik (delegate, observer) və ya idarə olunan obyekt həyat dövrü (deinit) lazım olduqda istifadə edin. Qalan hər şey üçün — struct.
Tez-tez verilən suallar
Struct Swift-də — kod hissələri arasında ötürülərkən surəti çıxarılan tip-dəyərdir (value type). Strukturlar xassələr, metodlar, başlatıcılar ehtiva edə və protokolları tətbiq edə bilər. Swift-in əsas tipləri (Int, String, Array) strukturlar kimi tətbiq edilmişdir.
Struct — value type (mənimsətmə zamanı surəti çıxarılır), mirası dəstəkləmir və ARC tələb etmir. Class — reference type (referans vasitəsilə ötürülür), mirası, deinitializasiyanı və referans sayılmasını dəstəkləyir. Tərtibatçılar struct-u susmaya görə tip kimi tövsiyə edir.
Mutating — struktur metodunun onun xassələrini dəyişə biləcəyini göstərən açar sözdür. Mutating olmadan kompilyator sahələrin modifikasiyasını qadağan edir. Mutating metodları yalnız var ilə elan edilmiş dəyişənlərdə çağırmaq olar, let ilə yox.
Copy-on-Write (COW) — Swift-də strukturlar üçün optimallaşdırmadır, burada məlumatların faktiki surətinin çıxarılması ilk mutasiya anına qədər təxirə salınır. Bütün dəyişənlər strukturu yalnız oxuduqca, onlar bir yaddaş sahəsini paylaşır. Bu, böyük kolleksiyalarla iş zamanı performansı artırır.
Struct-dan mirassız məlumat modelləri, konfiqurasiyalar, DTO və çoxiplikli ssenarilər üçün istifadə edin. Class-dan UIKit/AppKit UI komponentləri, singleton, ümumi eyniliyə malik varlıqlar (delegate, observer) və deinitializasiya tələb edən obyektlər üçün istifadə edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun