Thai Swift Class บทนี้จะเรียนรู้เรื่อง การใช้ Extension กันนะครับ
Extension ใน Swift จะมีประโยชน์มากโดยเราจะทำให้ ประเภทของตัวแปร (type),structure หรือแม้แต่ class มีความสามารถเพิ่ม เติมขึ้นมาตามงานที่เราต้องการใช้ได้ ลองมาดูตัวอย่างกันก่อนครับ
ตัวอย่างแรก : ลองประกาศตัวแปร sName เป็น String มีค่า “Swift” แล้ว อยากลองใส่ .”hello()” ต่อท้ายดู
1 2 3 |
var sName : String = "Swift" sName.hello() |
จะเห็นว่าเกิด error ขึ้น เพราะ String ไม่มี method หรือ property ชื่อ hello() อยู่เลย

ตอนนี้เราจะใช้ คำสั่ง extension มาต่อเติม hello() เพื่อเพิ่มความสามารถนี้เข้าไปอยู่ใน String
1 2 3 4 5 |
extension String { func hello() { println("hello \(self)") } } |
อธิบาย : เราใช้ extension นำหน้าด้วย ประเภทตัวแปร (Variable Type) , Struct หรือ Class แล้วตามด้วย { คำสั่งที่ต้องการเพิ่มเข้าไป }
โดย Hello() ที่เราสร้างขึ้นมานั้นก็เพื่อพิมพ์ค่าที่เก็บอยู่ในตัวแปรนั้นออกมาแสดง (ใช้ self เวลาต้องการแทนตัวแปร)
เมื่อเราลองกลับมาที่ sName ดูจะเห็นว่ามี method ใหม่เพิ่มเข้ามาชื่อ hello

กลับไปที่ extension แล้วเพิ่มคำอธิบาย method “///Say Hello to variable” ลงไป
1 2 3 4 5 6 7 8 9 |
extension String /// Say Hello to variable func hello() { println("hello \(self)") } } var sName : String = "Swift" sName.hello() |
จะสังเกตุว่าเราใส่ comment โดยใช้ /// (มี / สามอัน) ปกติ / สองครั้ง Swift ก็ถือเป็น comment ได้แล้วแต่การนำมาใช้อธิบายหัวข้อใน extension เราจะใช้ /// แทน
มาทดสอบ extension กับ Int กันบ้าง
เราอยากให้ String มารับค่าจาก Int ตรงๆ ซึ่งโดยปกตินั้นทำไม่ได้
1 2 |
var sGetInt : String? var iAge : Int = 20 |
จากนั้นใช้ extension เพิ่มความสามารถให้ Int แปลงตัวเลขให้เป็น String ได้
1 2 3 4 5 6 |
extension Int { ///Convert Integer to String func toString() -> String { return "\(self)" } } |
อย่าลืมใส่ comment /// ลงไปเพื่อง่ายต่อการเข้าใจภายหลัง

1 2 3 4 |
var sGetInt : String? var iAge : Int = 20 sGetInt = iAge.toString() println(sGetInt!) |
ผลการทำงาน ระบบจะพิมพ์ค่า ออกทางหน้าจอ
นำ extension มาใช้งานกับตัวแปรโครงสร้าง Struct
1 2 3 4 5 6 7 8 9 |
struct Student { var sName : String = "" var sSurname : String = "" var iScore : Int = 0 } protocol GeneralFunction { func findGrade(iScore : Int) -> String } |
จากตัวอย่างจะเห็นว่า Struct Student นั้นเก็บรายละเอียดคร่าวๆของนักเรียนใว้ แต่ถ้าเรามี protocol GeneralFunction ที่ในนั้นเก็บ function ค้นหาเกรด (findGrade) อยู่เราจะเอามาใช้ด้วยกันได้เลยใหมใน Struct โดยไม่ต้องสร้าง function แยก เราจึงให้ extension มารับหน้าที่นี้ไป
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
extension Student : GeneralFunction { func findGrade(iScore : Int) -> String { switch iScore { case 0...49: return "F" case 50...59: return "D" case 60...69: return "C" case 70...89: return "B" case 90...100: return "A" default: return "F" } } } println("\(mrJone.sName) has score \(mrJone.iScore) so grade will be \(mrJone.findGrade(mrJone.iScore))") |
ผลการทำงาน :
เราได้ใส่ method findGrade จาก Protocol เติมเข้าไปใน Struct Student แล้วต่อไปเราก็สามารถใช้ประโยชน์จาก Struct นี้ได้มากขึ้น (วิธีนี้เราก็สามารถที่จะนำไปใช้ได้กับ class ด้วยเหมือนกัน)
ยังไงก็ลองนำไปฝึกใช้งานดูครับ
แนะนำติชมได้ตลอดนะครับ ที่ thaiswiftclass@gmail.com และทาง https://www.facebook.com/thaiswiftclass