Class and Struct

เขียน Swift ไปสักพัก ก็น่าจะพอรู้แล้วแหละว่า ในภาษา Swift มันมี  class , enum , struct   ทั้งสามอย่างนี้เพื่อเก็บข้อมูล แต่หลักๆ ที่มันแตกต่างกัน คือ enum และ struct นั้นเป็น value type ส่วน class นั้นเป็น reference type

ถ้าเรามี class ง่ายๆ แบบนี้

ผลลัพธ์ที่ได้ก็คือ

Computer: Apple – Nvidia

อ้าว ทำไมเป็นแบบนี้อ่ะ ?

นั่นก็เพราะว่า จากที่ class มันเป็น reference type ทำให้ตัวแปร apple นั้นชี้ไปยัง dell ไม่ได้เป็นการสร้างอ๊อบเจ็คขึ้นมาใหม่แต่อย่างใด ดังนั้นแล้วเมื่อเปลี่ยนค่าใน apple ตัวแปร dell ก็เปลี่ยนตามไปด้วย เพราะมันคือสิ่งเดียวกัน

model1

งั้นลองพิจารณา struct ง่ายๆ กัน

ผลลัพธ์ที่ได้ก็คือ

CPU 1: AMD
CPU 2: Intel

เนื่องจาก struct นั้นจะเป็น value type  มันจึงทำการ ก๊อปปี้ ดังนั้น ตัวแปร amd และ intel  จึงเป็นคนละอ๊อบเจ็คกัน และเมื่อแก้ไขค่าในตัวแปร intel จึงไม่ส่งผลอะไรต่อกับ amd เลย

โอเคตอนนี้ ทุกคนคงเข้าใจแล้วว่า อะไรคือ reference type  และ value type

งั้นผมถามว่า จะเกิดอะไรขึ้นถ้าหากผม แก้คลาส  Computer ที่อยู่ในตัวอย่างแรก ให้เป็น struct ?

จากที่เมื่อกี้ผมเพิ่งได้บอกไปว่า struct มันเป็น value type ดังนั้นแล้ว apple กับ dell มันก็เป็นคนละตัวกันแล้ว ใช่ไหมครับ งั้น คำตอบที่ได้ มันควรเป็น แบบไหน ระหว่าง

1. Computer: Apple – Nvidia

2. Computer: Apple – AMD

3. Computer: Dell – Nvidia

4. Computer: Dell – AMD

ที่แน่ๆก็คือว่า มันคงไม่เป็น ข้อ 1 ใช่ไหมครับ ?  เพราะว่า ผมเพิ่งได้บอกไปว่า struct มันเป็น value type และเนื่องจากมันแยกกันแล้ว เป็นคนละ อ๊อบเจ็กกัน ดังนั้นมันก็ควร จะเป็น ข้อ 4.

แต่ปล่าวเลย มันก็ยังผิดอยู่ดี

คำตอบจริงๆมันคือข้อ 3

อ้าววววว ทำไมเป็นแบบนี้ละ ?

ลองกลับไปดูโค้ดครับ จะเห็นว่า VGA นั้นมันยังเป็น Class  อยู่

ฉนั้นแล้ว แม้ว่าเราจะทำให้ Computer จะเป็น struct แล้ว และมันก็เป็นคนละอ๊อบเจ็คกันแล้วก็ตาม  แต่ว่า vga มันยังเป็น  Class มันเลยทำให้ dell และ apple นั้นแชร์ ตัวแปร vga ร่วมกัน  คำตอบมันเลยเป็นข้อ 3

model2

ดังนั้น เมื่อทำงาน ระหว่าง struct กับ class ต้องระวังให้มากครับ  ต้องเข้าใจครับว่า ตัวแปรที่เราประกาศนั้นเป็น value หรือว่า reference type

ปล. จากที่เราได้เห็นว่า Class นั้นมันเกิดปัญหาเรื่อง reference ได้ เค้าเลยแนะนำให้ใช้ protocol oriented programming ไว้ว่างๆเดี๋ยวผมจะเขียนอธิบายนะครับ

Leave a Reply