มารู้จัก Instance Type บน iOS 7 SDK กันเถอะ


เริ่มเลยแล้วกัน เรามี Class อยู่ 2 Class นะครับ อันแรกคือ Employee Class ที่มี Property 2 ตัวคือ  name, salary แล้วทำการเขียน Convenience Constructor สำหรับการสร้าง Instance โดยกำหนด name ไปทันทีได้

และมี Manager Class ซึ่ง Subclass มาจาก Employee มีเพียง Property เดียวคือ subordinates (ผู้ใต้บังคับบัญชา) ส่วนของ name, salary Property จะได้มาจากการ Subclass อยู่แล้ว



คราวนี้จะเห็นว่า เมื่อเราสร้าง Employee จาก Convenience Constructor ก็ควรจะได้ Employee Object และเมื่อเราสร้าง Manager จาก Convenience Constructor เช่นกัน ก็ควรจะได้ Manager Object ผมจึงให้ Type ที่ return จาก Convenience Constructor เป็น id เนื่องจาก return type ที่เป็นไปได้มี 2 กรณี

แล้วอะไรที่เป็นปัญหา ...


เมื่อ return type ที่เราเลือกใช้เป็น id นั้น Objective-C จะไม่สามารถระบุได้ว่าจริงๆ แล้วมันแค่ Employee กับ Manager เพราะ id จะหมายถึงจะเป็น Type อะไรก็ได้ ดังนั้นเวลา autocomplete ก็จะขึ้น message ทั้งหมดออกมา และถ้าเราพลาดโปรแกรมก็จะ crash ทันที (SIGBRT) เนื่องจากไม่มีการ Implement message ที่ถูกเรียกนั่นเอง (ตัวอย่างแสดงการส่ง message -addObject ไปหา Employee Object ก็สามารถทำได้)


ก็ถ้า return type เป็น Employee Object ซะเลย พอเวลา autocomplete ก็ไม่มีปัญหาแล้ว เมื่อเขียน Code เราก็จะเจอแค่ message ที่เป็นของ Employee Class แต่เกิดอะไรขึ้น ? ถ้าเราจะสร้าง Manager ขึ้นมาสักคนล่ะ ? 


เนื่องจากมัน return มาเป็น Employee Object ดังนั้นก็จะไม่มีคุณสมบัติที่ Manager Class เขียนเพิ่มขึ้นมา ... ก็พังอีก ได้เวลาเปิดตัวพระเอกของเราแล้วนั่นคือ Instance Type มีรูปแบบการเขียนดังนี้


บน iOS 7 SDK และ 10.9 SDK (+Clang Extension) นั้นจะมีสิ่งที่เรียกว่า Instance Type ซึ่งจะตรวจสอบให้เราอัตโนมัติว่า เราสร้าง Instance จาก Class อะไร และ autocomplete message ของ Class นั้นๆ ออกมาอย่างครบถ้วน ซึ่งทุก message ที่ autocomplete มาให้ จะสามารถเรียกได้โดยไม่เกิดการ crash แต่อย่างใด


จากผลลัพธ์จะเห็นได้ว่าสิ่งที่ autocomplete มา มีทั้ง setSaraly ซึ่งเป็น message ของ Employee Class และ setSubordinates ที่เป็นของ Manager Class ทั้งคู่เลย 
ลองนำไปใช้ดูนะครับ :) ช่วยลดความผิดพลาดลงได้ ถ้าเข้าใจการใช้งานตรงนี้เพิ่มเติม  

Popular posts from this blog

12 วิธี การบริการและดูแลลูกค้าในร้าน Starbucks

[Android Dev] การติดตั้ง Eclipse+AndroidSDK เพื่อพัฒนาโปรแกรมบน Android

5 TED Talk ที่จะช่วยให้คุณทำงานดีขึ้น