Enum ใน Swift — คืออะไร ไวยากรณ์และการใช้งาน

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-06-17 เวลาอ่าน: 6 นาที

Enum ใน Swift เป็นชนิดที่รวบรวมกลุ่มของค่าที่เกี่ยวข้องกันไว้ภายใต้ชื่อเดียวกัน แตกต่างจาก C และ Objective-C ที่ enum เป็นเพียงชุดของค่าคงที่จำนวนเต็ม Swift นำเสนอ enumeration ระดับหนึ่งที่มี associated values, raw values, เมธอด และการรองรับโปรโตคอล ตามข้อมูลจาก Apple, 2026 enum เป็นหนึ่งในเครื่องมือสำคัญสำหรับการสร้างโมเดลสถานะแบบ type-safe ในการพัฒนา iOS

ประเด็นสำคัญ

  • Enum — ชนิดสำหรับกลุ่มของค่าที่เกี่ยวข้องกัน ช่วยรับประกันความปลอดภัยของชนิด
  • Raw Values — ค่าชนิดเดียวกันที่กำหนดให้กับทุกเคสของ enumeration
  • Associated Values — ชนิดข้อมูลต่าง ๆ ที่แนบกับแต่ละเคสเป็นรายบุคคล
  • เคส ถูกประกาศด้วยคำหลัก case และสามารถมีเมธอดได้
  • Switch กับ enum ต้องการการตรวจสอบทุกกรณีอย่างครบถ้วนโดยคอมไพเลอร์

Enum ใน Swift คืออะไร?

Enum (enumeration) เป็นชนิดข้อมูลที่กำหนดขึ้นเองซึ่งรวบรวมชุดตัวเลือกที่ไม่สามารถใช้ร่วมกันได้อย่างจำกัด ใน Swift enum ไม่ใช่แค่ค่าคงที่เชิงตัวเลข แต่เป็นชนิดที่สมบูรณ์พร้อมตรรกะของตัวเอง

แต่ละตัวแปรของ enumeration เรียกว่าเคส แตกต่างจาก Objective-C ที่ enum ลดรูปเป็น ชนิดจำนวนเต็ม Swift อนุญาตให้แต่ละเคสเก็บข้อมูลของตัวเองและมีเมธอดได้

ตามข้อมูลจาก Apple enum ใน Swift รองรับ generic, initializer, computed properties และการสอดคล้องกับโปรโตคอล — ทำให้สามารถนำไปใช้ในการสร้างโมเดลสถานะ ข้อผิดพลาด ตัวเลือก และเครื่องจักรสถานะจำกัด

ใช้ enum ทุกที่ที่คุณต้องการแสดง ชุดจำกัด ของตัวเลือกที่ไม่สามารถใช้ร่วมกันได้: สถานะหน้าจอ ชนิดข้อผิดพลาด ทิศทาง ตัวเลือกการกรอง

ไวยากรณ์การประกาศ Enum

Enum ถูกประกาศด้วยคำหลัก enum ตามด้วยชื่อและเนื้อความในวงเล็บปีกกา

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

เคสสามารถประกาศในบรรทัดเดียว โดยคั่นด้วย จุลภาค:

swift
enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

ในการเข้าถึงเคส ให้ใช้ ไวยากรณ์จุด หลังชนิดที่ทราบ:

swift
let direction = CompassDirection.north
// ทราบชนิดแล้ว — มีไวยากรณ์แบบย่อ:
var currentPlanet = .earth

เมื่อตัวแปรถูกกำหนดชนิด enum ที่ทราบแล้ว Swift จะอนุมานชนิดโดยอัตโนมัติ และสามารถละชื่อ enumeration เมื่อเข้าถึงเคสได้

Raw Values ใน enumeration

Raw Values คือค่าของชนิดเดียวที่กำหนดให้กับแต่ละเคสของ enum แตกต่างจาก associated values ตรงที่ raw values มีชนิดเดียวกันสำหรับทุกเคสและถูกกำหนดในเวลาประกาศ

swift
enum HTTPStatusCode: Int {
    case ok = 200
    case notFound = 404
    case internalServerError = 500
}

let code = HTTPStatusCode.notFound
print(code.rawValue) // 404

สำหรับ raw values แบบจำนวนเต็ม Swift จะ เพิ่มค่า โดยอัตโนมัติหากกำหนดเฉพาะค่าแรกอย่างชัดเจน:

swift
enum Status: Int {
    case pending = 1
    case active      // 2
    case completed   // 3
}

Raw values สามารถเป็นชนิด Int, String, Character หรือชนิดใดก็ได้ที่สอดคล้องกับโปรโตคอล RawRepresentable Swift จะสร้าง initializer init? โดยอัตโนมัติเพื่อสร้าง enum จาก raw value — สะดวกสำหรับการแยกวิเคราะห์ข้อมูลจาก API

Associated Values ใน enum

Associated Values อนุญาตให้ผูกชนิดข้อมูลต่าง ๆ เข้ากับแต่ละเคสของ enum เป็นรายบุคคล แตกต่างจาก raw values ตรงที่ associated values สามารถแตกต่างกันในชนิดและปริมาณ

swift
enum NetworkError {
    case timeout(seconds: Int)
    case httpError(code: Int, message: String)
    case noConnection
    case unknown(error: Error)
}

เมื่อประมวลผลด้วย switch associated values จะถูกดึงออกผ่านการผูกกับตัวแปรหรือค่าคงที่:

swift
let error = NetworkError.httpError(code: 403, message: "Forbidden")

switch error {
case .timeout(let seconds):
    print("หมดเวลาหลังจาก \(seconds)s วินาที")
case .httpError(let code, let message):
    print("HTTP \(code): \(message)")
case .noConnection:
    print("ไม่มีการเชื่อมต่อ")
case .unknown(let err):
    print("ไม่ทราบ: \(err.localizedDescription)")
}

ตาม เอกสาร Apple associated values ทำให้ enum เป็นเครื่องมือที่แสดงออกสำหรับการสร้างโมเดลสถานะซับซ้อนโดยไม่ต้องสร้างชนิด wrapper แยกต่างหาก ใช้สำหรับสถานการณ์แบบ Result และการสร้างโมเดลข้อผิดพลาดพร้อมบริบท

Enum แบบเรียกซ้ำ (indirect)

Enum แบบเรียกซ้ำ — enumeration ที่เคสของมันอ้างอิงถึงชนิด enum เอง เคสดังกล่าวถูกทำเครื่องหมายด้วยคำหลัก indirect

swift
indirect enum LinkedList<T> {
    case empty
    case node(value: T, next: LinkedList<T>)
}

การใช้ indirect ก่อน enum จะทำเครื่องหมายทุกเคสเป็นแบบเรียกซ้ำ หรือคุณสามารถทำเครื่องหมายเฉพาะเคสที่ต้องการด้วย indirect:

swift
enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

Swift ใช้ indirect เพื่อเก็บเคสแบบเรียกซ้ำเป็นข้อมูลอ้างอิง (reference semantics) แทนที่จะเป็นค่า — ซึ่งป้องกันขนาด enum ที่ไม่จำกัดบนสแต็ก Enum แบบเรียกซ้ำถูกใช้อย่างแพร่หลายในการสร้างต้นไม้ รายการโยง และ AST

Enum และโปรโตคอล

Enum สามารถสอดคล้องกับโปรโตคอลได้เช่นเดียวกับ struct และคลาส นี่คือความสามารถหลักของการเขียนโปรแกรมเชิงโปรโตคอลใน Swift

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 ยังสามารถสอดคล้องกับ โปรโตคอล Cocoa — ตัวอย่างเช่น CaseIterable สำหรับการสร้างคอลเลกชันของทุกเคสโดยอัตโนมัติ หรือ Codable สำหรับการทำให้เป็นอนุกรม สิ่งนี้ทำให้ enum เป็นส่วนประกอบอเนกประสงค์ในแอปพลิเคชัน Swift

คำถามที่พบบ่อย

Enum แตกต่างจาก struct ใน Swift อย่างไร?

Enum เป็นชนิดที่มีชุดจำกัดของตัวเลือกที่ไม่สามารถใช้ร่วมกันได้ ในขณะที่ struct เป็นชนิดที่มีชุดคุณสมบัติตามต้องการ Enum ไม่สามารถมี stored properties ได้ แต่รองรับ computed properties และเมธอด

Enum สามารถมีทั้ง raw values และ associated values ในเวลาเดียวกันได้หรือไม่?

ไม่ enum ไม่สามารถมีทั้ง raw values และ associated values ในเวลาเดียวกัน Raw values คือค่าชนิดเดียวกันสำหรับทุกเคส ในขณะที่ associated values คือข้อมูลส่วนบุคคลสำหรับแต่ละเคส กลไกเหล่านี้ไม่สามารถใช้ร่วมกันได้

จะรับอาร์เรย์ของทุกเคสของ enum ได้อย่างไร?

เพิ่มการสอดคล้องกับโปรโตคอล CaseIterable Swift จะสร้างคุณสมบัติ allCases โดยอัตโนมัติ ซึ่งส่งคืนคอลเลกชันของทุกเคสตามลำดับการประกาศ สะดวกสำหรับการวนซ้ำผ่านตัวเลือกทั้งหมด

จำเป็นต้องใช้ switch ในการประมวลผล enum หรือไม่?

Switch เป็นวิธีที่ปลอดภัยที่สุดเพราะคอมไพเลอร์ตรวจสอบความครอบคลุมครบถ้วน คุณสามารถใช้ if case เพื่อตรวจสอบเคสเดียว หรือ == สำหรับ enum ที่ไม่มี associated values

สามารถสร้าง enum ด้วย generic ได้หรือไม่?

ได้ enum รองรับ generic: enum Result<T, E> { case success(T); case failure(E) } สิ่งนี้ช่วยให้สร้างโครงสร้าง generic ที่ปลอดภัยชนิดสำหรับการจัดการความสำเร็จและข้อผิดพลาด

สรุป

  • Enum ใน Swift เป็นชนิดที่สมบูรณ์พร้อมรองรับเมธอด generic และโปรโตคอล
  • Raw Values อนุญาตให้กำหนดค่าชนิดเดียวกันสำหรับทุกเคส
  • Associated Values ให้ความสามารถในการผูกข้อมูลต่าง ๆ กับแต่ละเคส
  • เคส Indirect จำเป็นสำหรับโครงสร้างแบบเรียกซ้ำใน enum
  • โปรโตคอล สามารถถูกนำไปใช้โดย enum — นี่คือพื้นฐานของ POP ใน Swift
  • Switch กับ enum รับประกันการประมวลผลที่ครบถ้วนในเวลาคอมไพล์
  • ใช้ enum สำหรับการสร้างโมเดล สถานะจำกัด และตัวเลือกที่ปลอดภัยชนิด

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม