Enum Swift-də — bir ad altında əlaqəli dəyərlər qrupunu birləşdirən tipdir. C və Objective-C-dən fərqli olaraq, burada enum sadəcə tam ədədlər dəsti deyil, Swift associated values, raw values, metodlar və protokol dəstəyi ilə first-class enumerasiyalar təklif edir. Apple, 2026 məlumatlarına görə, enum iOS-development-də vəziyyətlərin tip təhlükəsiz modelləşdirilməsi üçün əsas alətlərdən biridir.
Əsas məqamlar
Enum (enumerasiya) — sonlu bir-birini istisna edən variantlar dəstini birləşdirən istifadəçi tipidir. Swift-də enum sadəcə rəqəmsal sabitlər deyil, öz məntiqinə malik tamhüquqlu tipdir.
Enumerasiyanın hər bir variantı case adlanır. Objective-C-dən fərqli olaraq, enum tam ədəd tipinə endirilir, Swift isə hər bir case-ə öz məlumatlarını saxlamağa və metodlara malik olmağa imkan verir.
Apple məlumatlarına görə, Swift-də enum generics, init metodları, hesablanmış xüsusiyyətlər və protokol tətbiqlərini dəstəkləyir — bu onu vəziyyətlərin, səhvlərin, seçimlərin və sonlu avtomatların modelləşdirilməsi üçün faydalı edir.
Enum-u sonlu çoxluq təqdim etmək lazım olan hər yerdə istifadə edin: ekran vəziyyətləri, səhv növləri, istiqamətlər, filtrləmə seçimləri.
Enum açar sözü enum ilə sonrakı ad və fiqurlu mötərizələrdə bədənlə elan edilir.
enum CompassDirection {
case north
case south
case east
case west
}
Case-lər vergül vasitəsilə bir sətirdə elan edilə bilər:
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
Case-ə müraciət etmək üçün məlum tipdən sonra nöqtə sintaksisi istifadə olunur:
let direction = CompassDirection.north
// Tip məlumdur — qısa sintaksis mövcuddur:
var currentPlanet = .earth
Məlum enum tipində dəyişənə təyin etdikdən sonra Swift avtomatik olaraq tipi çıxarır və case-lərə müraciət edərkən enumerasiya adını buraxmaq olar.
Raw Values — enum-un hər bir case-ə təyin edilən eyni tipli dəyərlərdir. Associated values-dən fərqli olaraq, raw values bütün case-lər üçün tipcə eynidir və elan zamanı təyin edilir.
enum HTTPStatusCode: Int {
case ok = 200
case notFound = 404
case internalServerError = 500
}
let code = HTTPStatusCode.notFound
print(code.rawValue) // 404
Tam ədədli raw values üçün Swift avtomatik olaraq dəyərləri artırır, əgər yalnız birincisi açıq şəkildə verilibsə:
enum Status: Int {
case pending = 1
case active // 2
case completed // 3
}
Raw values Int, String, Character və ya RawRepresentable protokoluna uyğun hər hansı tipdə ola bilər. Swift raw value-dən enum yaratmaq üçün avtomatik olaraq init? inizializatoru yaradır — bu API-dən məlumatları pars edərkən rahatdır.
Associated Values enumerasiyanın hər bir case-ə fərdi şəkildə müxtəlif tipdə məlumatları bağlamağa imkan verir. Raw values-dən fərqli olaraq, associated values tip və sayca fərqlənə bilər.
enum NetworkError {
case timeout(seconds: Int)
case httpError(code: Int, message: String)
case noConnection
case unknown(error: Error)
}
Switch vasitəsilə emal edərkən associated values dəyişənlər və ya sabitlərə bağlama yolu ilə çıxarılır:
let error = NetworkError.httpError(code: 403, message: "Forbidden")
switch error {
case .timeout(let seconds):
print("\(seconds)s sonra vaxt aşımı")
case .httpError(let code, let message):
print("HTTP \(code): \(message)")
case .noConnection:
print("Bağlantı yoxdur")
case .unknown(let err):
print("Naməlum: \(err.localizedDescription)")
}
Apple sənədlərinə görə, associated values enum-u ayrıca sarğı tipləri yaratmadan mürəkkəb vəziyyətləri modelləşdirmək üçün ifadəli bir alətə çevirir. Onları Result-oxşar ssenarilər və kontekstlə səhvlərin modelləşdirilməsi üçün istifadə edin.
Rekursiv enum — case-ləri enum tipinin özünə istinad edən enumerasiyadır. Belə case-lər indirect açar sözü ilə işarələnir.
indirect enum LinkedList<T> {
case empty
case node(value: T, next: LinkedList<T>)
}
indirect açar sözü enum qarşısında bütün case-ləri rekursiv olaraq işarələyir. Alternativ olaraq yalnız konkret case-i indirect ilə qeyd etmək olar:
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
Swift indirect istifadə edərək rekursiv case-ləri dəyərlər əvəzinə istinadlar (reference semantics) kimi saxlayır — bu, stack-də enum-un sonsuz ölçüsünün qarşısını alır. Rekursiv enum ağaclar, əlaqəli siyahılar və AST qurmaqda geniş istifadə olunur.
Enum strukturlar və siniflər kimi protokolları tətbiq edə bilər. Bu Swift-də protokol-yönümlü proqramlaşdırmanın əsas imkanıdır.
protocol Describable {
var description: String { get }
}
enum PaymentMethod: Describable {
case creditCard(last4: String)
case applePay
case bankTransfer
var description: String {
switch self {
case .creditCard(let last4):
return "Card ending in \(last4)"
case .applePay:
return "Apple Pay"
case .bankTransfer:
return "Bank Transfer"
}
}
}
Enum həmçinin Cocoa protokollarını tətbiq edə bilər — məsələn, bütün case-lərin kolleksiyasını avtomatik yaratmaq üçün CaseIterable və ya serializasiya üçün Codable. Bu enum-u Swift tətbiqlərində universal tikinti blokuna çevirir.
Tez-tez verilən suallar
Enum — sonlu bir-birini istisna edən variantlar dəsti olan tip, struct isə ixtiyari xüsusiyyətlər dəsti olan tipdir. Enum stored properties-ə malik ola bilməz, lakin computed properties və metodları dəstəkləyir.
Xeyr, enum eyni anda həm raw values, həm də associated values malik ola bilməz. Raw values — bütün case-lər üçün eyni tipli dəyərlər, associated values — hər bir case üçün fərdi məlumatlardır. Bu mexanizmlər bir-birini istisna edir.
CaseIterable protokoluna uyğunluq əlavə edin. Swift avtomatik olaraq bütün case-ləri elan sırası ilə qaytaran allCases xüsusiyyətini yaradır. Bu bütün variantlar üzrə iterasiya üçün rahatdır.
Switch — ən təhlükəsiz üsuldur, çünki kompilyator tam əhatəni yoxlayır. Bir case-i yoxlamaq üçün if case və ya associated values olmayan enum üçün == istifadə edilə bilər.
Bəli, enum generics dəstəkləyir: enum Result<T, E> { case success(T); case failure(E) }. Bu, uğur və səhvin işlənməsi üçün tip təhlükəsiz ümumiləşdirilmiş konstruksiyalar yaratmağa imkan verir.
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