เรียนภาษา Swift กับ ThaiSwiftClass.com ตอน Protocol & Delegates Part 1

สำหรับบทนี้การสร้างตัวเชื่อมให้แต่ละ Class สื่อสารกันได้ง่ายขึ้นใน Swift โดยจะเป็นการใช้คำสั่ง Protocol ในการทำหน้าที่เป็นตัวแทน (Delegates) เรามารู้ความหมายของคำว่า Protocol ก่อนดีกว่า

 “Protocal (n) ข้อตกลงในการทำการสื่อสาร การกำหนดความหมาย และวิธีการในการสื่อสาร”

    ถ้าจะอธิบายให้ชัดคือเวลานำมาใช้กับการเขียนโปรแกรมคือ Protocol จะทำหน้าที่เป็นสื่อกลางเก็บทั้ง Method (Function) และ Property (ตัวแปร) เอาใว้ สำหรับนำไปใช้ได้ทั้งใน Class (class) Structure (struct) และ Enumurator (enum) ต่อได้นั่นเอง

                ลองมาดูตัวอย่างการใช้งาน Protocol กันโดย เราต้องการสร้าง class นักมวยมาต่อสู้กัน คนนึงเป็นมวยไทย อีกคนเป็นนักมวยสากล ทั้งคู่มีความสามารถต่อยได้เหมือนกัน แต่นักมวยสากลเตะไม่ได้ เราจึงต้องสร้างตัวเชื่อมระหว่างนักมวยทั้งสองคือ Protocol สำหรับออกแอคชั่น (เตะ หรือต่อย) เพื่อนำมาใส่ลงใน class ต่อไป

ลองดูหลักการประกาศ Protocol คร่าวๆก่อน

protocol protocol_name {

      properties {get set}

      method 

}

ที่นี้ลองมาสร้างกัน ขั้นแรกสร้าง Protocol ชื่อ pc_action สำหรับเก็บท่าทางของนักมวยก่อนอย่างการต่อย , เตะ

ThaiSwiftClass Swift OOP Protocol 1

ThaiSwiftClass Swift OOP Protocol 1

 

จะเห็นว่าใน func kick() กับ func punch() จะยังไม่มีการเขียนโค๊ดใดๆลงไปทั้งสิ้น เพราะต้องการบอกว่า Protocol pc_action นี้เก็บ function 2 ตัวนี้ใว้รอให้ใครนำไปใช้งาน

 

ขั้นตอนที่ 2 เขียน class เก็บรายละเอียดเบื้องต้น และ class ของนักมวยไทย

ThaiSwiftClass Swift OOP Protocol 2

ThaiSwiftClass Swift OOP Protocol 2

ถ้าสังเกตุใน class muaythaiBoxer จะสืบทอด (inherit) จาก class “sportman” และ นำ protocol “pc_action” มาใช้

โดยเราต้องนำ function ทุกอันที่อยู่ใน protocol ดังกล่าวมาใช้ (implement) รวมถึง properties หรือตัวแปร  (ถ้ามี) มาใช้ให้ครบ ถ้าไช้ไม่ครบจะเกิด error ขึ้นได้ ให้ลองดู class สำหรับนักมวยสากล ซึ่งนักมวยสากลจะเตะไม่ได้ จึงไม่สามารถนำ func kick() มาใช้งานได้

 

ThaiSwiftClass Swift OOP Protocol 3

ThaiSwiftClass Swift OOP Protocol 3

 

ทางนึงในการแก้ปัญหาแบบนี้คือต้องใส่ @objc นำหน้า protocal เพื่อให้ protocol ตัวนี้สามารถใส่ optional ใว้ข้างหน้า func ได้เพื่อกำหนดให้ method ดังกล่าวเป็นแค่ optional หรือไม่ต้องนำมาใช้ก็ได้

ThaiSwiftClass Swift OOP Protocal 4 using optional

ThaiSwiftClass Swift OOP Protocol 4 using optional

 

กลับไปที่ class muayThaiBoxer ต้องเติม @objc ใว้หน้า method ที่ไม่ใช่ optional คือ punch (ถ้า method เป็น optional ทั้ง protocol ก็ไม่ต้องใส่ @objc ก็ได้)

ThaiSwiftClass Swift OOP Protocol 5_1

ThaiSwiftClass Swift OOP Protocol 5_1 Muay Thai class

 

 

ที่ class InterBoxer เราไม่จำเป็นต้องเรียกใช้ method kick() อีกต่อไปเพราะเป็น optional ไม่ถูกบังคับให้ใช้อีกต่อไป

ThaiSwiftClass Swift OOP Protocol 5

ThaiSwiftClass Swift OOP Protocol 5 International boxing Class

 

ลองนำไปใช้งานจริง

ThaiSwiftClass Swift OOP Protocol 6

ThaiSwiftClass Swift OOP Protocol 6

ให้ Koasand เป็นนักมวยไทยชื่อ Kaosand มีความสามารถทั้งเตะและต่อย

ให้ Tyson เป็นนักมวยสากล มีความสามารถแค่ต่อยได้อย่างเดียว

ผลการทำงาน

ThaiSwiftClass Swift OOP Protocol 7 result

ThaiSwiftClass Swift OOP Protocol 7 result

 

***ในส่วนของ @objc protocol  หรือ optional method ใน protocol นั้นจะใช้ได้กับเฉพาะ class เท่านั้นไม่สามารถนำไปใช้กับ struct หรือ enum ได้

 

บทต่อไปจะลงลึกเกี่ยวกับ protocol & delegate กว่าเดิมอีกหน่อยนะครับ
แนะนำติชมได้ตลอดนะครับ ที่ thaiswiftclass@gmail.com และทาง https://www.facebook.com/thaiswiftclass

Leave a Reply