iOS Tutorial – Begin with Swift ( Day 2 ) – Control Flow

swift-128x128

รู้จักกับ Control flow

1.Conditional statement ซึ่งทำการ execute กลุ่มของโค้ดตามเงื่อนไขต่างๆ เช่น ตามเงื่อนไขที่ให้มา ถ้าตรงตามเงื่อนไขให้แสดงผลว่าข้อมูลถูกต้อง ถ้าไม่ตรงตามเงื่อนไขให้แสดงข้อความแจ้งผลการผิดพลาด
1.1 if statement ใช้ evaluate เงื่อนไขที่มีจำนวนการแสดงผลลัพท์ที่ต่างกันไม่มาก
if (a) then b else c
ถ้า condition ใน a นั้นเป็นจริง b จะเกิดขึ้น
ถ้า condition ใน a ไม่เป็นจริง c จะเกิดขึ้น

สำหรับ condition นั้น operator ที่ใช้ได้ มีดังนี้ :-

 < น้อยกว่า
<= น้อยกว่าหรือเท่ากัน
> มากกว่า
>= มากกว่าหรือเท่ากัน
== เปรียบเทียบว่าเท่ากัน
!= เปรียบเทียบว่าไม่เท่ากัน
=== เปรียบเทียบว่าเท่ากัน(memory)
!== เปรียบเทียบว่าไม่เท่ากัน(memory)

สำหรับ Boolean expression ที่สามารถใช้ใน condition ได้มีดังนี้ :-

&& และ
|| หรือ
! ไม่

ตัวอย่างการใช้ if -then-else

let meltingPoint = 100  // Constant
var waterTemp = 60      // Variable
if ( waterTemp == meltingPoint ){     // ถ้าอุณหภูมิถึงจุดเดือด
   print("Reach melting point")
}else{
   print("Keep boiling")
}

ผลที่ได้คือ

Keep boiling

สำหรับ Ternary Operator ที่ใช้ได้

a ? b : c  เป็น shortcut ของ if (a) then b else c

ตัวอย่าง condition ที่น่าสนใจเช่น

var b = 5 < 6

ถ้าขยายความจากด้านบนจะได้เป็น

var b:Bool = (5<6)         //ซึ่งก็คือ var b:Bool = false

จากตัวอย่างข้างต้นจะเห็นได้ว่า การใส่ data type กำกับ และการใส่วงเล็บ จะป้องกันการสับสนในการอ่านโค๊ดได้

1.2 Switch ทำงานคล้ายกับ if-then-else แต่แทนที่จะพิจารณาเงื่อนไข(condition) เราอาศัยการเปรียบเทียบของค่านั้นๆ กับแต่ละรูปแบบ(pattern) ที่เราใช้เปรียบเทียบแล้วจึงทำการ execute โค๊ดตามเงื่อนไขที่ตรงกัน และมักจะใช้เมื่อ เงื่อนไขที่ใช้เปรียบเทียบนั้นมีหลายกรณี

switch( value ){
   case someValue:
       //do something
   case someValue:
      //do something
   default:
      //do something
}

ข้อควรจำ(***) การใช้ switch ใน swift นั้นอธิบายไว้ว่า switch จะมีประสิทธิภาพมากกว่าภาษาแนว c ภาษาอื่นตรงที่ ในแต่ละ case นั้นไม่จำเป็นต้องมี break เพื่อเป็นจุดบอกว่า ให้หยุดการกระทำการ ไม่กระทำการใน case ต่อๆไป เพราะใน swift นั้นในแต่ละ case จะจบการกระทำการในกลุ่มโค้ดของตัวเองเลย จึงทำให้เป็นการป้องกันการเขียนโค้ดแล้วลืมใส่ break  อันนี้ก็แล้วแต่ความเห็นแต่ละคนนะว่าชอบแบบนี้รึเปล่า

ตัวอย่างเช่น

var day:Int = 3
switch (day){
   case 1:
      print("Monday")
   case 2:
      print("Tuesday")
   case 3:
      print("Wednesday")        // บรรทัดนี้จะถูกแสดงผลออกมา
   case 4:
      print("Thursday")
   case 5:
      print("Friday")
   case 6:
      print("Saturday")
   case 7:
      print("Sunday")
   default:
      print("Wrong input")
}

ผลลัพท์ที่ได้คือ

Wednesday

1.3 guard อันนี้คาดว่าน่าจะเป็นตัวใหม่ เพราะไม่เคยได้ยินชื่อเหมือนกัน  guard ทำงานคล้ายกับ if ตรงที่ทำการพิจารณาเงื่อนไข(condition) ที่เป็น boolean เราจะใช้ guard ก็ต่อเมื่อต้องการจะพิสูจน์ว่า เงื่อนไขนั้นเป็นจริงแล้วจึงจะทำการกระทำการ(execute) โค๊ดส่วนที่อยู่หลังบล๊อก {} ต่อ(หากไม่เข้าใจให้ตามไปดูตัวอย่างด้านล่าง) และ guard นั้นจะมาพร้อม else เสมอ จะทำการ(execute) โค๊ดใน else ก็ต่อเมื่อ ไม่ตรงตามเงื่อนไขตามที่ระบุไว้

guard condition else{
    // do something
}

ตัวอย่างการใช้ guard

// define function
func addNewStudent(student:[String:String]){

    // Check if student name is valid
    guard let name = student["name"] else {
        print("Invalid student name")
        return
    }
    
    print("Valid student")
    
    // Check if student email is valid
    guard let email = student["email"] else{
        print("Invalid email")
        return
    }
    
    // Send
    print("Sending email to student name:\(name) at \(email)")
}

// Execute function
var student = ["name":"David", "email":"xyz@booboohome.com"]
addNewStudent(student)

ผลลัพท์ที่แสดง

Valid student
Sending email to student name:David at xyz@booboohome.com

2. Loops ใช้กับ flow ที่ต้องการกระทำซ้ำๆ

2.1 For Loop

For-in : Loop in range ใน swift สามารถกระทำซ้ำๆ ได้จาก array, dictionary, range, string, charatersใน string

for index in start...end {
   // do something
}

Loop with increment or decrement

for i=5; i<10; i++ {
    // do something 
}

Loop with dictionary

let studentGrades = ["David":"A", "Peter":"C", "John":"B"]
for(name, grade) in studentGrades{
    print("\(name) get grade \(grade)")
}

ผลที่ออกมาคือ

John get grade B
David get grade A
Peter get grade C

ข้อควรจำ(***) จะเห็นว่าลำดับการแสดงผลของ dictionary จะไม่เรียงลำดับตามที่เรากำหนดค่าไปให้ เนื่องจาก dictionary เป็นการเก็บข้อมูลแบบไม่เรียงลำดับ

2.2 While loop มักใช้กับกรณีที่เราไม่รู้จำนวณรอบของการพิจารณาซ้ำๆ โดยจะพิจารณาเงื่อนไขที่กำหนดและพิจารณาไปเรื่อยๆ จนตรงตามเงื่อนไขที่กำหนด จึงจะกระทำการในบล๊อค {} ในswift มี while loop สองแบบ คือ while และ repeat while

while waterTemp < meltingPoint{
   // keep boiling the water
}
Repeat { 
    // boiling the water 
}
while waterTemp < meltingPoint

วันต่อไป==>รู้จักกับ Collection