iOS Tutorial – Begin with Swift ( day 4 ) – Function

รู้จักกับ Function
ฟังก์ชันคือ กลุ่มของคำสั่งที่ถูกรวมกัน เพื่อทำตามจุดประสงค์โดยรวมของกลุ่มคำสั่งนั้นๆ   ฟังก์ชันจะประกอบด้วยองค์ประกอบหลักๆ คือ

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(&currentMaxScore, scores:studentScores)
print("This semester the maximum score is \(currentMaxScore)")

การใช้ฟังก์ชันนั้นสามารถใช้ได้แบบซับซ้อนกว่านี้อีกที่เราไม่ได้พูดถึง เช่น การส่งฟังก์ชันหนึ่งไปเป็นตัวแปรนึงของอีกฟังก์ชันหนึ่ง เพื่อกระทำการตามคำสั่งใดๆ ในกรณีที่โปรแกรมนั้นค่อนข้างซับซ้อน

อ่านเพิ่มเติม ที่นี่

วันต่อไป  closure