Enum ใน Swift เป็นชนิดที่รวบรวมกลุ่มของค่าที่เกี่ยวข้องกันไว้ภายใต้ชื่อเดียวกัน แตกต่างจาก C และ Objective-C ที่ enum เป็นเพียงชุดของค่าคงที่จำนวนเต็ม Swift นำเสนอ enumeration ระดับหนึ่งที่มี associated values, raw values, เมธอด และการรองรับโปรโตคอล ตามข้อมูลจาก Apple, 2026 enum เป็นหนึ่งในเครื่องมือสำคัญสำหรับการสร้างโมเดลสถานะแบบ type-safe ในการพัฒนา iOS
ประเด็นสำคัญ
Enum (enumeration) เป็นชนิดข้อมูลที่กำหนดขึ้นเองซึ่งรวบรวมชุดตัวเลือกที่ไม่สามารถใช้ร่วมกันได้อย่างจำกัด ใน Swift enum ไม่ใช่แค่ค่าคงที่เชิงตัวเลข แต่เป็นชนิดที่สมบูรณ์พร้อมตรรกะของตัวเอง
แต่ละตัวแปรของ enumeration เรียกว่าเคส แตกต่างจาก Objective-C ที่ enum ลดรูปเป็น ชนิดจำนวนเต็ม Swift อนุญาตให้แต่ละเคสเก็บข้อมูลของตัวเองและมีเมธอดได้
ตามข้อมูลจาก Apple enum ใน Swift รองรับ generic, initializer, computed properties และการสอดคล้องกับโปรโตคอล — ทำให้สามารถนำไปใช้ในการสร้างโมเดลสถานะ ข้อผิดพลาด ตัวเลือก และเครื่องจักรสถานะจำกัด
ใช้ enum ทุกที่ที่คุณต้องการแสดง ชุดจำกัด ของตัวเลือกที่ไม่สามารถใช้ร่วมกันได้: สถานะหน้าจอ ชนิดข้อผิดพลาด ทิศทาง ตัวเลือกการกรอง
Enum ถูกประกาศด้วยคำหลัก enum ตามด้วยชื่อและเนื้อความในวงเล็บปีกกา
enum CompassDirection {
case north
case south
case east
case west
}
เคสสามารถประกาศในบรรทัดเดียว โดยคั่นด้วย จุลภาค:
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
ในการเข้าถึงเคส ให้ใช้ ไวยากรณ์จุด หลังชนิดที่ทราบ:
let direction = CompassDirection.north
// ทราบชนิดแล้ว — มีไวยากรณ์แบบย่อ:
var currentPlanet = .earth
เมื่อตัวแปรถูกกำหนดชนิด enum ที่ทราบแล้ว Swift จะอนุมานชนิดโดยอัตโนมัติ และสามารถละชื่อ enumeration เมื่อเข้าถึงเคสได้
Raw Values คือค่าของชนิดเดียวที่กำหนดให้กับแต่ละเคสของ enum แตกต่างจาก associated values ตรงที่ raw values มีชนิดเดียวกันสำหรับทุกเคสและถูกกำหนดในเวลาประกาศ
enum HTTPStatusCode: Int {
case ok = 200
case notFound = 404
case internalServerError = 500
}
let code = HTTPStatusCode.notFound
print(code.rawValue) // 404
สำหรับ raw values แบบจำนวนเต็ม 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 เป็นรายบุคคล แตกต่างจาก raw values ตรงที่ associated values สามารถแตกต่างกันในชนิดและปริมาณ
enum NetworkError {
case timeout(seconds: Int)
case httpError(code: Int, message: String)
case noConnection
case unknown(error: Error)
}
เมื่อประมวลผลด้วย switch associated values จะถูกดึงออกผ่านการผูกกับตัวแปรหรือค่าคงที่:
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 แบบเรียกซ้ำ — enumeration ที่เคสของมันอ้างอิงถึงชนิด enum เอง เคสดังกล่าวถูกทำเครื่องหมายด้วยคำหลัก indirect
indirect enum LinkedList<T> {
case empty
case node(value: T, next: LinkedList<T>)
}
การใช้ indirect ก่อน enum จะทำเครื่องหมายทุกเคสเป็นแบบเรียกซ้ำ หรือคุณสามารถทำเครื่องหมายเฉพาะเคสที่ต้องการด้วย indirect:
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
Swift ใช้ indirect เพื่อเก็บเคสแบบเรียกซ้ำเป็นข้อมูลอ้างอิง (reference semantics) แทนที่จะเป็นค่า — ซึ่งป้องกันขนาด enum ที่ไม่จำกัดบนสแต็ก Enum แบบเรียกซ้ำถูกใช้อย่างแพร่หลายในการสร้างต้นไม้ รายการโยง และ AST
Enum สามารถสอดคล้องกับโปรโตคอลได้เช่นเดียวกับ struct และคลาส นี่คือความสามารถหลักของการเขียนโปรแกรมเชิงโปรโตคอลใน 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 เป็นชนิดที่มีชุดคุณสมบัติตามต้องการ Enum ไม่สามารถมี stored properties ได้ แต่รองรับ computed properties และเมธอด
ไม่ enum ไม่สามารถมีทั้ง raw values และ associated values ในเวลาเดียวกัน Raw values คือค่าชนิดเดียวกันสำหรับทุกเคส ในขณะที่ associated values คือข้อมูลส่วนบุคคลสำหรับแต่ละเคส กลไกเหล่านี้ไม่สามารถใช้ร่วมกันได้
เพิ่มการสอดคล้องกับโปรโตคอล CaseIterable Swift จะสร้างคุณสมบัติ allCases โดยอัตโนมัติ ซึ่งส่งคืนคอลเลกชันของทุกเคสตามลำดับการประกาศ สะดวกสำหรับการวนซ้ำผ่านตัวเลือกทั้งหมด
Switch เป็นวิธีที่ปลอดภัยที่สุดเพราะคอมไพเลอร์ตรวจสอบความครอบคลุมครบถ้วน คุณสามารถใช้ if case เพื่อตรวจสอบเคสเดียว หรือ == สำหรับ enum ที่ไม่มี associated values
ได้ enum รองรับ generic: enum Result<T, E> { case success(T); case failure(E) } สิ่งนี้ช่วยให้สร้างโครงสร้าง generic ที่ปลอดภัยชนิดสำหรับการจัดการความสำเร็จและข้อผิดพลาด
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ