Class & Struct
นอกจาก type พื้นฐานที่ Swift มีมาให้แล้ว นอกจาก Enum ที่เราสามารถสร้าง type ใหม่ได้แล้ว ยังมี Class กับ Struct อีกที่เราสามารถนำมาสร้าง type ใหม่ได้
ในบางครั้งเราต้องการเก็บข้อมูลที่เกี่ยวข้องกันหลายประเภทไว้ด้วยกัน เนื่องจาก type มาตรฐานไม่สามารถทำได้ เราจึงต้องประกาศ type ใหม่ของเราเอง
เช่น เราต้องการ type ใหม่เพื่อเก็บข้อมูล user หนึ่งคน ซึ่งอาจประกอบไปด้วย ชื่อ นามสกุล อายุ ส่วนสูง และอื่น ๆ ถ้าเราใช้ type มาตรฐาน จะกลายเป็นว่าเราจะต้องมีตัวแปรมากมาย ซึ่งจะทำให้โค้ดของเราจัดการ, แก้ไข หรืออ่านได้เข้าใจยาก
การประกาศ Struct และ Class
ทั้ง Struct และ Class เราสามารถมี store properties ในการเก็บค่าได้แบบนี้
ในการสร้าง instance ของ Struct และ Class เราสามารถทำได้แบบนี้
การอ้างถึง properties จะใช้ .
ในการอ้าง
Struct จะมี initializer มาให้โดยมี argument เท่ากับ properties ที่มีเรียงตามลำดับที่ประกาศ ในกรณีที่ต้องการ initial ด้วยค่าอื่นเราสามารถทำได้เลย แบบนี้
ทำให้เราไม่จำเป็นต้องกำหนดค่า default ตอนประกาศ Struct ได้
ซึ่ง Class ไม่สามารถทำได้เนื่องจากไม่มี initializer ให้ ถ้าเราเขียนแบบนี้จะ error
เราจึงต้องเขียน initializer เองแบบนี้
การอ้างอึงถึง instance ของตัวเองเราจะใช้ keyword self
แต่เราจะใช้ในกรณีที่ต้องใช้ จากตัวอย่างก่อนหน้า initializer มี parameter name ที่ซำ้กันกับ property name ใน class เราจึงจำเป็นใช้ self.name
ในการอ้างถึงตัวแปร name ใน class
ในกรณีที่ไม่จำเป็น เราจะไม่ใส่ self.
ทั้ง Struct และ Class สามารถมี method (ฟังก์ชั่น) ได้ทั้งคู่
Struct เป็น Value Type
นั่นคือเป็นการ copy ค่าเวลามีการเปลี่ยนแปลง ไม่ได้เปลี่ยนแปลงบนตัวเองอย่าง Class ที่เป็น Reference Type
ที่เมื่อ class เปลี่ยนค่าในตัวเองยังคงใช้ reference เดิมอยู่
ทำให้ Struct เวลามีการแก้ไขค่าภายหลัง การประกาศตัวแปรจะต้องใช้ var
แทน let
และหากมี method ทำให้เกิดการเปลี่ยนแปลงค่าใน Struct จะต้องใส่ mutating
ที่หน้าฟังก์ชั่นนั้น
ทั้ง Struct และ Class สามารถมี compute properties ได้
นอกจาก Struct กับ Class จะต่างกันที่ value กับ refence type แล้ว ยังมีความแตกต่างอย่างอื่นอีก ที่มีเฉพาะใน Class ดังนี้
ความสามารถในการ inherit จาก parent
การใช้ deinit ในการ deinitialize
การมีมากกว่า 1 reference ชี้มาที่ instance
type casting เป็น parent หรือ subclass (แน่นอน เพราะว่า Struct ไม่สามารถ inherit ได้แบบ class)
Last updated