Class & Struct

นอกจาก type พื้นฐานที่ Swift มีมาให้แล้ว นอกจาก Enum ที่เราสามารถสร้าง type ใหม่ได้แล้ว ยังมี Class กับ Struct อีกที่เราสามารถนำมาสร้าง type ใหม่ได้

ในบางครั้งเราต้องการเก็บข้อมูลที่เกี่ยวข้องกันหลายประเภทไว้ด้วยกัน เนื่องจาก type มาตรฐานไม่สามารถทำได้ เราจึงต้องประกาศ type ใหม่ของเราเอง

เช่น เราต้องการ type ใหม่เพื่อเก็บข้อมูล user หนึ่งคน ซึ่งอาจประกอบไปด้วย ชื่อ นามสกุล อายุ ส่วนสูง และอื่น ๆ ถ้าเราใช้ type มาตรฐาน จะกลายเป็นว่าเราจะต้องมีตัวแปรมากมาย ซึ่งจะทำให้โค้ดของเราจัดการ, แก้ไข หรืออ่านได้เข้าใจยาก

การประกาศ Struct และ Class

struct Position {
    // structure definition goes here
}
class Person {
    // class definition goes here
}

ทั้ง Struct และ Class เราสามารถมี store properties ในการเก็บค่าได้แบบนี้

struct Position {
    var x = 0
    var y = 0
}

class Person {
    var name = ""
    var age = 20
}

ในการสร้าง instance ของ Struct และ Class เราสามารถทำได้แบบนี้

let origin = Position()
let pop = Person()

การอ้างถึง properties จะใช้ . ในการอ้าง

print(origin.x)
print(pop.name)

Struct จะมี initializer มาให้โดยมี argument เท่ากับ properties ที่มีเรียงตามลำดับที่ประกาศ ในกรณีที่ต้องการ initial ด้วยค่าอื่นเราสามารถทำได้เลย แบบนี้

let firstPoint = Position(x: 0, y: 5)

ทำให้เราไม่จำเป็นต้องกำหนดค่า default ตอนประกาศ Struct ได้

struct Position {
    var x: Int
    var y: Int
}

ซึ่ง Class ไม่สามารถทำได้เนื่องจากไม่มี initializer ให้ ถ้าเราเขียนแบบนี้จะ error

class Person {
    var name: String
    var age: Int
}

let john = Person(name: "John", age: 20)

เราจึงต้องเขียน initializer เองแบบนี้

class Person {
    var name: String
    var age: Int

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

ทั้ง Struct และ Class สามารถมี method (ฟังก์ชั่น) ได้ทั้งคู่

struct Position {
    var x: Int
    var y: Int

    func display() {
        print("x: \(x), y: \(y)")
    }
}

class Person {
    var name: String
    var age: Int

    func display() {
        print("name: \(name) age: \(age)")
    }

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

firstPoint.display()
john.display()

ทั้ง Struct และ Class สามารถมี compute properties ได้

struct Position {
    var x: Int
    var y: Int

    var description: String {
        return "x: \(x), y: \(y)"
    }

    func display() {
        print(description)
    }
    
    mutating func move(to position: Position) {
        self.x = position.x
        self.y = position.y
    }
}

class Person {
    var name: String
    var age: Int

    var description: String {
        return "name: \(name), age: \(age)"
    }

    func display() {
        print("name: \(name) age: \(age)")
    }

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

นอกจาก Struct กับ Class จะต่างกันที่ value กับ refence type แล้ว ยังมีความแตกต่างอย่างอื่นอีก ที่มีเฉพาะใน Class ดังนี้

  • ความสามารถในการ inherit จาก parent

  • การใช้ deinit ในการ deinitialize

  • การมีมากกว่า 1 reference ชี้มาที่ instance

  • type casting เป็น parent หรือ subclass (แน่นอน เพราะว่า Struct ไม่สามารถ inherit ได้แบบ class)

Last updated