ตอนที่ 4 iOS Swift Enumerations และโครงสร้าง (Structures)

  1. พื้นฐาน Enumerations
  2. Enumerations ด้วยค่าที่เกี่ยวข้อง (Associated Values)
  3. โครงสร้าง (Structures) และกรณีการใช้งาน (Use Cases)
  4. ประเภทค่าเทียบ (Value Types) กับประเภทการอ้างอิง (Reference Types)

Swift เป็นภาษาการทำแอพที่ทรงพลังและใช้งานง่ายซึ่งออกแบบโดย Apple สำหรับการรับทำแอพ iOS, macOS, watchOS และ tvOS เป็นที่รู้จักในด้านไวยากรณ์และคุณสมบัติที่ทันสมัย การแจงนับ (Enumerations) และโครงสร้าง (Structures) เป็นหนึ่งในคุณสมบัติหลักเหล่านี้ ซึ่งมีบทบาทสำคัญในการทำให้โค้ด iOS Swift มีประสิทธิภาพและแสดงออกมากขึ้น ในบทความนี้ เราจะลงลึกไปที่ Enumerations และโครงสร้าง (Structures) กรณีการใช้งาน และความแตกต่างระหว่างประเภทค่าและประเภทการอ้างอิง

1. พื้นฐาน Enumerations

Enumerations หรือเรียกง่ายๆ ว่า “enum” เป็นประเภทข้อมูลแบบกำหนดเองที่แสดงถึงกลุ่มของค่าที่เกี่ยวข้อง ช่วยให้การทำแอพกับค่าเหล่านี้ในลักษณะที่ปลอดภัยสำหรับประเภท Enums มีประโยชน์อย่างยิ่งเมื่อคุณต้องการกำหนดชุดของกรณีและปัญหาที่แตกต่างกัน เช่น ทิศทางของเข็มทิศหรือวันในสัปดาห์

ตัวอย่าง Enumerations อย่างง่ายสำหรับวันในสัปดาห์:

enum Weekday {
    case monday
    case tuesday
    case wednesday
    case thursday
    case friday
    case saturday
    case sunday
}

จากนั้นสามารถใช้ Enumerations นี้ในโค้ดของคุณ เช่นนี้

let today = Weekday.friday

2. Enumerations ด้วยค่าที่เกี่ยวข้อง (Associated Values)

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

พิจารณาตัวอย่างที่คุณกำลังทำแอพสำหรับร้านพิซซ่า คุณสามารถใช้ Enumerations ที่มีค่าที่เกี่ยวข้องเพื่อแสดงขนาดพิซซ่าที่แตกต่างกันด้วยเส้นผ่านศูนย์กลางที่เกี่ยวข้อง:

enum PizzaSize {
    case small(Int)
    case medium(Int)
    case large(Int)
}

จากนั้น คุณสามารถสร้างอินสแตนซ์ของ Enumerations นี้ด้วยค่าที่เกี่ยวข้อง เช่นนี้

let smallPizza = PizzaSize.small(10)
let mediumPizza = PizzaSize.medium(12)
let largePizza = PizzaSize.large(14)

สามารถใช้คำสั่ง switch เพื่อแยกค่าที่เกี่ยวข้อง:

func printPizzaSize(_ size: PizzaSize) {
    switch size {
    case let .small(diameter):
        print("Small pizza with a diameter of \(diameter) inches")
    case let .medium(diameter):
        print("Medium pizza with a diameter of \(diameter) inches")
    case let .large(diameter):
        print("Large pizza with a diameter of \(diameter) inches")
    }
}

3. โครงสร้าง (Structures) และกรณีการใช้งาน (Use Cases)

โครงสร้าง (Structures) หรือ “struct” เป็นประเภทข้อมูลแบบกำหนดเองที่อนุญาตให้คุณสรุปคุณสมบัติและวิธีการที่เกี่ยวข้อง โครงสร้างมีประโยชน์อย่างยิ่งเมื่อคุณต้องการสร้างแบบจำลองข้อมูลที่ซับซ้อน จัดระเบียบโค้ดของคุณ และสร้างส่วนประกอบที่นำมาใช้ซ้ำได้

ต่อไปนี้คือตัวอย่างโครงสร้างอย่างง่ายที่แสดงถึงจุด 2 มิติ:

struct Point {
    var x: Double
    var y: Double
}

จากนั้น คุณสามารถสร้างอินสแตนซ์ของโครงสร้างนี้และเข้าถึงคุณสมบัติของมันได้ เช่น:

var pointA = Point(x: 3.0, y: 4.0)
print("Point A: (\(pointA.x), \(pointA.y))")

โครงสร้างใน Swift ยังสามารถมีเมธอด ซึ่งเป็นฟังก์ชันที่เป็นของโครงสร้าง:

struct Point {
    var x: Double
    var y: Double

    func distance(to other: Point) -> Double {
        let deltaX = x - other.x
        let deltaY = y - other.y
        return sqrt(deltaX * deltaX + deltaY * deltaY)
	}
}

ตอนนี้สามารถใช้เมธอด `distance(to:)` เพื่อคำนวณระยะห่างระหว่างจุดสองจุด:

let pointA = Point(x: 3.0, y: 4.0)
let pointB = Point(x: 6.0, y: 8.0)
let distance = pointA.distance(to: pointB)
print("Distance between point A and point B: \(distance)")

4. ประเภทค่าเทียบ (Value Types) กับประเภทการอ้างอิง (Reference Types)

Swift มีสองวิธีหลักในการจัดเก็บและส่งผ่านข้อมูล: ประเภทค่าและประเภทการอ้างอิง Enumerations และโครงสร้างเป็นประเภทค่า ในขณะที่คลาสเป็นประเภทการอ้างอิง ความแตกต่างที่สำคัญระหว่างทั้งสองอยู่ที่วิธีการจัดเก็บและจัดการข้อมูล

ประเภทค่า (Value Types):

  • เมื่อประเภทค่าถูกกำหนดให้กับตัวแปร ค่าคงที่ หรือส่งผ่านเป็นอาร์กิวเมนต์ของฟังก์ชัน สำเนาของค่าจะถูกสร้างขึ้น ซึ่งหมายความว่าการเปลี่ยนแปลงที่เกิดขึ้นกับอินสแตนซ์หนึ่งจะไม่ส่งผลกระทบต่ออินสแตนซ์อื่นๆ
  • โดยทั่วไป ประเภทของค่าจะมีประสิทธิภาพมากกว่าประเภทการอ้างอิง เนื่องจากถูกจัดเก็บไว้ในสแต็กและไม่ต้องการการจัดสรรฮีปหรือการนับการอ้างอิง
  • ตัวอย่างของชนิดค่า ได้แก่ Enumerations โครงสร้าง และชนิดข้อมูลพื้นฐาน เช่น Int, Double และ Bool

ประเภทการอ้างอิง (Reference Types):

  • เมื่อประเภทการอ้างอิงถูกกำหนดให้กับตัวแปร ค่าคงที่ หรือส่งผ่านเป็นอาร์กิวเมนต์ของฟังก์ชัน การอ้างอิงไปยังวัตถุที่มีอยู่จะถูกใช้แทนการสร้างสำเนา ซึ่งหมายความว่าการเปลี่ยนแปลงที่เกิดขึ้นกับอินสแตนซ์หนึ่งอาจส่งผลต่ออินสแตนซ์อื่นๆ
  • ประเภทการอ้างอิงต้องมีการจัดสรรฮีปและการนับการอ้างอิง ซึ่งอาจมีประสิทธิภาพน้อยกว่าประเภทค่า
  • ตัวอย่างของประเภทการอ้างอิง ได้แก่ คลาส การปิด และไลบรารีมาตรฐาน Swift บางประเภท เช่น Array และ Dictionary

โดยทั่วไป คุณควรเลือกใช้ประเภทค่าเมื่อต้องการสรุปข้อมูลอย่างง่าย ตรวจสอบให้แน่ใจว่าข้อมูลไม่เปลี่ยนแปลง หรือเพิ่มประสิทธิภาพการทำงาน ใช้ประเภทการอ้างอิงเมื่อคุณต้องการแบ่งปันสถานะที่ไม่แน่นอนหรือแบบจำลองความสัมพันธ์ที่ซับซ้อนระหว่างวัตถุ

Enumerations และโครงสร้างเป็นคุณสมบัติที่สำคัญของการทำแอพ iOS Swift ที่ช่วยให้คุณเขียนโค้ดที่แสดงออกอย่างชัดเจนและมีประสิทธิภาพมากขึ้น Enumerations ที่มีค่าที่เกี่ยวข้องทำให้คุณสามารถแนบข้อมูลเพิ่มเติมกับแต่ละกรณีได้ ในขณะที่โครงสร้างจะช่วยให้คุณสามารถสรุปคุณสมบัติและวิธีการที่เกี่ยวข้องได้ การทำความเข้าใจความแตกต่างระหว่างประเภทค่าและประเภทการอ้างอิงเป็นสิ่งสำคัญเมื่อตัดสินใจว่าจะใช้ Enumerations โครงสร้าง หรือคลาสในการรับทำแอพ Swift ของคุณ ด้วยความรู้ที่มีอยู่ คุณสามารถใช้ประโยชน์สูงสุดจากคุณสมบัติอันทรงพลังของ Swift และทำแอพที่แข็งแกร่งและบำรุงรักษาได้

เขียน App iOS Swift

ตอนที่ 3 iOS Swift คอลเลกชัน (Collections)
ตอนที่ 5 iOS Swift แนะนำ Classes, Inheritance และ Protocols สำหรับ OOP