รู้จักกับ Function
ฟังก์ชันคือ กลุ่มของคำสั่งที่ถูกรวมกัน เพื่อทำตามจุดประสงค์โดยรวมของกลุ่มคำสั่งนั้นๆ ฟังก์ชันจะประกอบด้วยองค์ประกอบหลักๆ คือ
Keyword: func ซึ่งเป็นการบอกว่ากลุ่มคำสั่งนี้คือการประกาศฟังก์ชัน
ชื่อฟังก์ชัน(name): เป็นชื่อที่ถูกตั้งขึ้นตามจุดประสงค์ของกลุ่มคำสั่ง เพื่อไว้ใช้เรียกกลุ่มของคำสั่งนั้น
ข้อมูลตัวแปร(argument): ซึ่งเป็นข้อมูลเพิ่มเติมที่ถูกส่งเข้าไปในฟังก์ชัน เพื่อทำให้ฟังก์ชันนั้นสามารถทำงานบรรลุตามจุดประสงค์ของฟังก์ชัน ซึ่งฟังก์ชันอาจกำหนดให้มี หรือไม่มีข้อมูลตัวแปรนี้ก็ได้ ข้อมูลตัวแปรนี้สามารถใช้ได้หลายประเภทตั้งแต่ การส่งตัวแปรแบบธรรมดาอย่างภาษา c ทั่วไป หรือไปถึงประเภทที่ซับซ้อน ตามการส่งตัวแปรแนว objective-c
กลุ่มคำสั่ง(statement): ซึ่งเป็นกลุ่มคำสั่งที่ใช้ดำเนินการเพื่อให้บรรลุจุดประสงค์ของฟังก์ขัน
ข้อมูลตัวแปรที่ส่งกลับ(return value): เป็นข้อมูลตัวแปรที่เป็นผลลัพท์จากการกระทำตามกลุ่มคำสั่งและต้องการส่งผลกลับออกไป ซึ่งฟังก์ชันอาจจะมีหรือไม่มี return value ก็ได้ตามแต่กำหนด ถ้าไม่ต้องการให้มี return value ฟังก์ชันจะมี return type เป็น void คือไม่มีประเภทใดๆ
ตัวอย่างการประกาศฟังก์ชันแบบไม่มีตัวแปร และไม่มีการคืนค่ากลับ
func greeting(){
print("Welcome to Swift Tutorial")
}
greeting() //execute function
ตัวอย่างการประกาศฟังก์ชันแบบมีตัวแปร แต่ไม่มีการคืนค่ากลับ
func greeting(firstName:String, lastName:String){
print("Welcome \(firstName), \(lastName) to Swift Tutorial")
}
greeting("David", lastName: "Bay")
ผลที่ได้คือ
Welcome David, Bay to Swift Tutorial
จากตัวอย่าง เห็นได้ว่าเรามีการระบุตัวแปร firstName, lastName ซึ่งเป็นข้อมูลประเภท String ให้กับฟังก์ชัน เมื่อเราต้องการจะเรียกใช้ฟังก์ชันเราจึงต้องส่งข้อมูลเข้าไปให้ฟังก์ชันด้วยดังตัวอย่าง ใน swift นั้นตัวแปรตัวแรกเราสามารถละเว้นไม่ใส่ชื่อของตัวแปรได้ แต่ว่าตัวแปรต่อๆ ไปเราจำเป็นต้องระบุชื่อของตัวแปรลงไปกำกับเวลาเรียกใช้ฟังก์ชันด้วย
ตัวอย่างการประกาศฟังก์ชันแบบมีตัวแปร และมีการคืนค่ากลับ
func sortScore(scores:Array<Double>)->(min:Double, max:Double){
var max = -1000.0
var min = 1000.0
for score in scores {
if score > max {
max = score
}
if( score < min ){
min = score
}
}
return (min, max)
}
var studentScores = [67.5, 70.5, 80, 55, 72, 92.5, 80, 60, 85]
let result = sortScore(studentScores)
print("This semester student minimum score:\(result.min), maximum score:\(result.max)")
ผลที่ได้คือ
This semester student minimum score:55.0, maximum score:92.5
จากตัวอย่างข้างต้น เราได้มีการส่งตัวแปร scores ซึ่งเป็น array ของคะแนนที่เป็นชนิด double โดยภายในฟังก์ชันจะทำการหาว่าคะแนนมากที่สุดและน้อยที่สุดในภาคเรียนนี้คือเท่าไร จากนั้นต้องการให้ผลลัพท์จากฟังก์ชันคืนกลับออกมาซึ่งมีสองค่าคือ min, max
ตัวอย่างการประกาศฟังก์ชันแบบกำหนดตัวแปรและค่าตั้งต้น
func multiplyByTwo(number:Int=2)->Int{
return 2*number
}
let result1 = multiplyByTwo(5) // result 10
let result2 = multiplyByTwo() // result 4 : ไม่มีตัวแปรส่งเข้าไป จึงใช้ค่า default
จากตัวอย่างในฟังก์ชันจะรับตัวแปรชื่อ number ซึ่งมีชนิดข้อมูลเป็น integer และหากไม่มีการระบุค่าให้ตัวแปร number ฟังก์ชันจะใช้ค่า 2 เป็นค่าตั้งต้น
ตัวอย่างการประกาศฟังก์ชันแบบรับตัวแปรไม่ระบุจำนวนที่แน่นอน(variadic parameter) ซึ่งการระบุแบบนี้จะใช้ สัญลักษณ์ “…” จุดสามตัว แทนการระบุตัวแปรแบบไม่ระบุจำนวนที่แน่นอน ซึ่งการระบุแบบนี้ฟังก์ชันสามารถรับได้ตั้งแต่ 1 ตัวแปร ไปจนถึงหลายๆ ตัวแปรได้ ขึ้นอยู่กับข้อมูลที่เราจะทำการส่งเข้าไป
func averageScore(scores:Double...)->Double {
var sum = 0.0
for score in scores {
sum += score
}
let result = sum / Double(scores.count)
return result
}
let resultA = averageScore(65, 70) // 2 paramters result:67.5
let resultB = averageScore(67, 89, 90, 85) // 4 parameters result: 82.75
ปกติแล้วค่าตัวแปรที่ถูกส่งเข้ามาในฟังก์ชันนั้นเป็นค่าคงที่ เราไม่สามารถทำการแก้ไขหรือ เปลี่ยนแปลงค่าภายในฟังก์ชันได้อีก แต่ใน swift นั้นหากเราต้องการที่จะเปลี่ยนแปลงค่าของตัวแปรที่ถูกส่งเข้ามาในฟังก์ชันเราก็สามารถทำได้ โดยการเพิ่มคีย์เวิร์ด inout ไปหน้าการประกาศตัวแปรแต่ละตัว และใส่ & ที่หน้าข้อมูลแต่ละตัวเวลาเราทำการเรียกใช้ฟังก์ชัน
func maxScore(inout currentMaxScore:Double, scores:Array<Double>){
for score in scores {
if score > currentMaxScore {
currentMaxScore = score
}
}
}
var currentMaxScore = 85.0
var studentScores = [67.5, 70.5, 80, 55, 72, 92.5, 80, 60, 85]
maxScore(¤tMaxScore, scores:studentScores)
print("This semester the maximum score is \(currentMaxScore)")
การใช้ฟังก์ชันนั้นสามารถใช้ได้แบบซับซ้อนกว่านี้อีกที่เราไม่ได้พูดถึง เช่น การส่งฟังก์ชันหนึ่งไปเป็นตัวแปรนึงของอีกฟังก์ชันหนึ่ง เพื่อกระทำการตามคำสั่งใดๆ ในกรณีที่โปรแกรมนั้นค่อนข้างซับซ้อน
อ่านเพิ่มเติม ที่นี่
วันต่อไป closure
