Swift-də Enum — bu nədir, sintaksis və istifadə

Müəllif: IT Sectr Dərc olunub: 2026-06-17 Oxuma vaxtı: 6 dəq

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 — tip təhlükəsizliyi təmin edən əlaqəli dəyərlər qrupu üçün tip
  • Raw values — enumerasiyanın bütün case-ləri üçün eyni tipli eyni dəyərlər
  • Associated values — hər bir case-ə fərdi şəkildə bağlanmış müxtəlif tipdə məlumatlar
  • Case-lər açar sözü case ilə elan edilir və metodlar ehtiva edə bilər
  • Switch enum ilə kompilyator tərəfindən bütün variantların tam əhatə olunmasını tələb edir

Swift-də enum nədir?

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 elanının sintaksisi

Enum açar sözü enum ilə sonrakı ad və fiqurlu mötərizələrdə bədənlə elan edilir.

swift
enum CompassDirection {
    case north
    case south
    case east
    case west
}

Case-lər vergül vasitəsilə bir sətirdə elan edilə bilər:

swift
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:

swift
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.

Enumerasiyalarda Raw Values

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.

swift
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ə:

swift
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.

Enum-da Associated Values

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.

swift
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:

swift
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 (indirect)

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.

swift
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:

swift
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 və protokollar

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.

swift
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 Swift-də struct-dan nə ilə fərqlənir?

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.

Enum eyni anda həm raw values, həm də associated values malik ola bilərmi?

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.

Enum-un bütün case-lərinin massivini necə əldə etmək olar?

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.

Enum-u emal etmək üçün switch istifadə etmək məcburidir?

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.

Generics ilə enum yaratmaq olarmı?

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ə

  • Enum Swift-də — metodlar, generics və protokollar dəstəyi ilə tamhüquqlu tip
  • Raw values bütün case-lər üçün eyni tipli eyni dəyərləri təyin etməyə imkan verir
  • Associated values hər bir case-ə müxtəlif məlumatları bağlamaq imkanı verir
  • Indirect case-lər enum-da rekursiv strukturlar üçün zəruridir
  • Protokollar enum tərəfindən tətbiq edilə bilər — bu Swift-də POP-un əsasıdır
  • Switch enum ilə kompilyasiya səviyyəsində tam emalı təmin edir
  • Enum-u sonlu vəziyyətlərin və tip təhlükəsiz seçimlərin modelləşdirilməsi üçün istifadə edin

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.

Layihəni müzakirə et

Həm də oxuyun