สำหรับบทนี้เราจะมารู้จักกับการใช้งานฟังก์ชั่นในสวิฟท์ได้หลายรูปแบบและหลากหลายมากขึ้น ก่อนอื่นเราลองมาดูการประกาศฟังก์ชั่นทั่วๆไปก่อนนะครับ (*สำหรับคนที่อยากทบทวนเรื่องฟังก์ชั่นกดตรงนี้)
1 2 3 |
func areacheck(width_ : Double,length_ : Double,height_ : Double ) -> Double { return width_ * length_ * height_ } let getArea = areacheck(10,length_: 14,height_: 20) print(getArear) |
จากตัวอย่างข้างบนเราสร้างฟังก์ชั่น areacheck เพื่อคำนวนพื้นที่โดยรับ 3 พารามิเตอร์ และจะส่งผลการคำนวนออกเป็น Double จากนั้นให้ ตัวแปร getArea มารับค่าจากฟังก์ชั่นตามปกติ
มาลองดูการประกาศตัวแปรให้เป็นฟังก์ชั่นดูบ้าง
1 2 3 4 |
let arearcheck2 = areacheck getArear = arearcheck2(10,length_: 14,height_: 20) print(getArear) |
จะเห็นว่า areacheck2 นั่นประกาศแบบตัวแปรทั่วไป แต่ถ้าเราแทนที่ฟังก์ชั่นโดยไม่ใส่พารามิเตอร์ใดๆลงไป areacheck2 ก็จะกลายเป็นฟังก์ชั่นที่มีคุณสมบัติเหมือน arercheck ทันที
Closure (โคลส’เชอะ) คืออะไร?
Closures คือการที่โครงสร้างฟังก์ชั่นแบบนึงที่นำไปใช้ได้ทุกที่ที่ต้องการ ไม่ว่าจะไปอยู่ในตัวแปร หรือไปซ้อนอยู่ในพารามิเตอร์ของฟังก์ชั่นอื่นๆ โดยมีรูปแบบดังนี้
{(parameter) -> return type in statement }
ลองดูตัวอย่างการใช้งาน Ex.1
1 2 3 |
let sArea_ = { (needParam:Double) -> String in return "Closure Area 1 = \(needParam)" } |
ตัวแปร sArea_ จะกลายเป็นฟังก์ชั่นที่รองรับพารามิเตอร์แบบ Double แล้ว return type เป็น String โดยเราสามารถนำฟังก์ชั่น areacheck จากตัวอย่างแรกมาใส่เป็นพารามิเตอร์ได้
1 |
print(sArea_(areacheck(3,length_: 4,height_: 5))) |
ตัวอย่างการใช้งาน Ex.2
1 2 3 4 5 |
var ClosureArea2 : (Double,Double,Double) ->Double ClosureArea2 = { (w,l,h) in ( w * l * h) } print("ClosureArea2 = \(ClosureArea2(1,2,3))") |
จาก Ex.2 ประกาศโครงสร้างตัวแปรเอาใว้ก่อน แล้วค่อยมาทำงานทีหลังก็ได้
1 2 3 |
ClosureArea2 = { (a,b,c) in ( (a + b) * c) } print("ClosureArea2 after change logic = \(ClosureArea2(1,2,3))") |
Ex.3 เรายังสามารถใช้แทนพารามิเตอร์ด้วย $0
1 2 3 4 5 |
var ClosureArea3 : (Double,Double,Double) ->Double ClosureArea3 = { $0 * $1 * $2 } print("ClosureArea3 = \(ClosureArea3(1,2,3))") |
Ex.4 แบบไม่ต้องมีพารามิเตอร์ใดๆ สามารถนำไปใช้งานได้เลย
1 2 3 |
var return10 = {() -> () in print("result of return10")} return10() |
Ex.5 นำไปใช้กับ Array ด้วย method .map
1 2 3 4 5 6 7 |
var sResult : String -> String sResult = { "hello \($0)" } var sPlayer = ["Peter", "Evan", "Dimitri"] print(sPlayer.map(sResult)) |
ผลที่ได้จาก Ex.5 [“hello Peter”, “hello Evan”, “hello Dimitri”]
เนื่องจาก .map จะไล่ส่ง hello ไปทีละ element ที่อยู่ใน array ด้วยการแทนค่าลงใน $0
Ex.5.1 เพิ่มเติมกับการใช้งาน Closure ใน Array
1 2 3 4 5 6 7 |
var iMultiply : Int -> Int iMultiply = {$0 * 5} var iListNumber = [1,2,3,4,5,6,7,8,9,10,11,12] print("Multiply by 5 = \(iListNumber.map(iMultiply))") |
ผลที่ได้จาก Ex.5.1 Multiply by 5 = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60]
Ex.6 ลองนำไปใช้กับ Dictionary
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
let Number_ = [0:"Zero",1:"One",2:"Two",3:"Three",4:"Four",5:"Five",6:"Six",7:"Seven",8:"Eight",9:"Nine"] let sTelNo = { (param:Int) -> String in return "\(Number_[param])" } let sSpellNo = {(param:Int) -> String in var number = param var sOutput : String = "" while number > 0 { sOutput = Number_[number % 10]! + sOutput number /= 10 } return sOutput } print(sSpellNo(100)) |
ผลที่ได้จาก Ex.6 OneZeroZero
**การที่เราดึงค่าจาก Dictionary มานั้น Swift จะมองเป็น Optional เสมอ เพราะฉนั้นต้องใช้ “!” เพื่อ unwrap ค่าออกมาด้วยครับ
ลองนำไปฝึกใช้งานดูครับ
แนะนำติชมได้ตลอดนะครับ ที่ thaiswiftclass@gmail.com และทาง https://www.facebook.com/thaiswiftclass