ตอนที่ 5 iOS Swift แนะนำ Classes, Inheritance และ Protocols สำหรับ OOP

  1. การกำหนด (Defining) และการเริ่มต้น (Initializing) คลาส (Classes)
  2. การสืบทอด (Inheritance) และการจัดคลาสย่อย (Subclassing)
  3. โปรโตคอลและการเขียนโปรแกรมเชิงโปรโตคอล (Protocol-Oriented Programming)
  4. การแปลงประเภท (Type Casting) และการตรวจสอบประเภท (Type Checking)

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

1. การกำหนด (Defining) และการเริ่มต้น (Initializing) คลาส (Classes)

1.1 คลาสคืออะไร

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

1.2 การกำหนด (Defining) คลาส

หากต้องการกำหนดคลาสใน Swift ให้ใช้คีย์เวิร์ด ‘class’ ตามด้วยชื่อคลาสและวงเล็บปีกกาคู่หนึ่ง ภายในวงเล็บ คุณสามารถประกาศคุณสมบัติและวิธีการ:

class Dog {
    var name: String
    var breed: String

    func bark() {
        print("Woof!")
    }
}
1.3 การเริ่มต้น (Initializing) คลาส

การเริ่มต้นเป็นกระบวนการเตรียมอินสแตนซ์ของคลาสเพื่อใช้งาน ใน Swift initializers เป็นเมธอดพิเศษที่คุณกำหนดด้วยคีย์เวิร์ด ‘init’ พวกเขาตั้งค่าเริ่มต้นสำหรับคุณสมบัติของอินสแตนซ์และดำเนินการตั้งค่าที่จำเป็น:

class Dog {
    var name: String
    var breed: String

    init(name: String, breed: String) {
        self.name = name
        self.breed = breed
    }

    func bark() {
        print("Woof!")
    }
}

let myDog = Dog(name: "Max", breed: "Labrador")

2. การสืบทอด (Inheritance) และการจัดคลาสย่อย (Subclassing)

2.1 การสืบทอด (Inheritance)

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

2.2 การกำหนด (Defining) คลาสย่อย (Subclass)

หากต้องการสร้างคลาสย่อยใน Swift ให้ใช้โคลอน ‘:’ ตามด้วยชื่อซูเปอร์คลาส:

class Poodle: Dog {
    var isShowDog: Bool

    init(name: String, isShowDog: Bool) {
        self.isShowDog = isShowDog
        super.init(name: name, breed: "Poodle")
    }
}
2.3 แทนที่ (Overriding) เมธอด (Methods)

คลาสย่อยสามารถแทนที่เมธอด superclass ได้โดยใช้คีย์เวิร์ด ‘override’ ก่อนนิยามเมธอด:

class Poodle: Dog {
    // ...

    override func bark() {
        print("Yip!")
    }
}

3. โปรโตคอลและการเขียนโปรแกรมเชิงโปรโตคอล (Protocol-Oriented Programming)

3.1 โปรโตคอลคืออะไร

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

3.2 การกำหนด (Defining) โปรโตคอล

ในการกำหนดโปรโตคอล ให้ใช้คีย์เวิร์ด ‘protocol’ ตามด้วยชื่อโปรโตคอลและวงเล็บปีกกาคู่หนึ่ง:

protocol Drawable {
    var color: String { get set }
    func draw()
}
3.3 การใช้งาน (Adopting) โปรโตคอล

หากต้องการใช้งานโปรโตคอล ให้เพิ่มลงในคำจำกัดความของคลาสหลังซูเปอร์คลาส โดยคั่นด้วยเครื่องหมายจุลภาค:

class Circle: Drawable {
    var radius: Double
    var color: String

    init(radius: Double, color: String) {
        self.radius = radius
        self.color = color
    }

    func draw() {
        print("Drawing a \(color) circle with radius \(radius)")
    }
}

4. การแปลงประเภท (Type Casting) และการตรวจสอบประเภท (Type Checking)

4.1 การแปลงประเภท (Type Casting) คืออะไร

การแคสติ้งประเภท (Type Casting) ช่วยให้คุณสามารถปฏิบัติต่ออินสแตนซ์ของคลาสใดคลาสหนึ่งเป็นอินสแตนซ์ของคลาสอื่นภายในลำดับชั้นของคลาสนั้น ใน iOS Swift คุณสามารถดำเนินการพิมพ์โดยใช้ ‘as?’ และ ‘as!’ ได้

4.2 การตรวจสอบประเภท (Type Checking)

คุณสามารถใช้คำหลัก ‘is’ เพื่อตรวจสอบว่าอินสแตนซ์เป็นประเภทที่ระบุหรือไม่:

let dog: Dog = Poodle(name: "Buddy", isShowDog: true)

if dog is Poodle {
    print("This dog is a Poodle")
} else {
    print("This dog is not a Poodle")
}
4.3 ดาวน์คาสต์ (Downcasting)

การดาวน์แคสติ้งทำให้คุณสามารถแคสต์อินสแตนซ์ระดับซูเปอร์คลาสไปยังประเภทคลาสย่อยประเภทใดประเภทหนึ่งได้ ใช้ ‘as?’ ตัวดำเนินการสำหรับ downcasting หรือ ‘as!’ สำหรับการดาวน์แคสต์แบบบังคับ:

let dog: Dog = Poodle(name: "Buddy", isShowDog: true)

if let poodle = dog as? Poodle {
    print("This dog is a Poodle named \(poodle.name)")
} else {
    print("This dog is not a Poodle")
}

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

เขียน App iOS Swift

ตอนที่ 4 iOS Swift Enumerations และโครงสร้าง (Structures)
ตอนที่ 6 iOS Swift ตัวเลือก (Optionals) และการจัดการข้อผิดพลาด (Error Handling)