21

Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให
Page 2: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

Thai SwiftApple’s new programming language

Tanasak Tantitarntong

This book is for sale at http://leanpub.com/ThaiSwift

This version was published on 2014-07-27

This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing process. Lean Publishing is the actof publishing an in-progress ebook using lightweight tools and many iterations to get reader feedback, pivot until you have theright book and build traction once you do.

©2012 - 2014 Tanasak Tantitarntong

Page 3: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

Tweet This Book!Please help Tanasak Tantitarntong by spreading the word about this book on Twitter!

The suggested hashtag for this book is #ThaiSwift.

Find out what other people are saying about the book by clicking on this link to search for this hashtag on Twitter:

https://twitter.com/search?q=#ThaiSwift

Page 4: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

Swift เปน programming language ใหมทคดคนโดย Apple และจะกลายเปนภาษาหลกทใชเขยนโปรแกรมสำหรบ iOS และ OS X ในอนาคต

เปาหมายของหนงสอเลมนคอ เปนหนงสอทเกบรวบรวมขอมลตางๆเกยวกบ Swift Programming เปนภาษาไทย เพอใหคนไทย เดกไทย ไดศกษาการเขยนโปรแกรมลงบน iOS หรอ Mac ไดโดยงาย

หนงสอเลมน ทำไวเพอแจกฟร หรอ อยในระบบ Donation base หามนำไปพมซำหรอจำหนายโดยเดดขาด หนงสอเลมน เปนหนงสอทเขยนตามความเขาใจของผแตง ทกอยางทอยในหนงสอเลมนอาจจะมขอผดพลาดบางสวนซงผแตงไมรบประกนเนอหาของหนงสอ และการนำไปขอมลไปใชงานนนใหผ

อานเปนผตดสนใจโดยทผแตงจะไมรบผดชอบตอขอผดพลาดใดๆทงสน

เนองจากผเขยนเปนคนทภาษาไทยแยมาก ผมขออภยมาณทนดวย หากทาพบวาเนอหาผดพลาดประการใด ผมยนดทจะแกไขใหถกตองครบ หากทานพบวาหนงสอเลมนมประโยชน อยากสนบสนน หรออยากชวยเพมเตมขอมล ตดตอผมไดท [email protected] จะพยายามตอบกลบใหเรวทสดครบ

ขอบคณครบ

Page 5: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

สารบญ

The Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Constants and Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4Printing Constants and Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4Semicolons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4Integers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5Floating-Point Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Type Safety and Type Interference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Nummeric Literals and Conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Integer (and Floating Point) Conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Type Aliases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8Booleans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8Tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Optionals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

Page 6: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

สารบญ 1

เรยนผอาน หนงสอเลมนกำลงอยระหวางการปรบปรงเนอหา การปรบปรงเนอหารอบน จะเปนการปรบปรงโดยการเปลยนจากการแปลหนงสอ เปนการเรยบเรยงเนอหาใหมโดยผแตง เพอใหภาษาเปนทางการมากขนและเขาใจงายขนครบ

คาดวาจะปรบปรงบท 1 และ 2 แลวเสรจในชวงกลางเดอนสงหาคมครบ

Page 7: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basicsกอนอน ใหลองสราง playground project ขนมาใหพรอมกอน

Playground project จะมอยใน Xcode 6 ขนไปเทานน

Xcode create playground project

Swift Data Type นนมพนฐานมาจาก C และ Objective C โดยทมทง Int, Double, Float, Bool, String หรอ Collection Type เชน Array และDictionary นอกจาก Type ทเคยชนประเภทนแลวยงม Type ใหมๆอนๆอกดวย

Swift ใชกลกการเขยนแบบ Type Safe โดยท ถาตอนสราง variable เปน Type String แลวจะไมสามารถเปลยนไปช value ทเปน Type Int ได เพอปองกนการเกด Bug ในอนาคต (ตวอยางเชน optional value ทจะพดถงในบทตอๆไป)

Constants and Variables

สงทสำคญทสดสำหรบการเขยนโปรแกรมสำหรบผมคอ Variable และ Data Type

Declaring Constants and Variables

สำหรบ Swift มการสราง Variable หลกๆสองแบบคอ var และ let ทงสองอนตางกนอยางไร? ตางกนท let ใชสำหรบสราง constant แต var จะไมใชconstant (var สามารถเปลยนคาได)

Page 8: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basics 3

1 var myVariable = 1

2 myVariable = 2

แต let จะเปลยนไมได

1 let myConstant = 100

..

Noteถา value ทเราจะใชนนไมมวนเปลยน ใหใช let เสมอ และถาอาจจะมการเปลยนแปลงใหใช var เสมอ

ใหสงเกตวา เราไมไดใส Data Type เขาไปให myVariable หรอ myConstant เลย

การสรางแบบนเรยกวา Implicit คอการสรางแลวให Swift เลอกให ตวอยาง

1 let x = 70 // Implicit integer

2 let y = 70.0 // Implicit double

สงเกตวา Swift จะ auto เลอก Data Type ให

Type Annotations

ถาเราตองการจะเลอก Data Type เองนนจะเรยกวา Explicit ซงผมจะขอยกตวอยาง Data Type ประเภท Number ทงหมด (ทผมนกออก) Syntax คอการใชเครองหมาย :คนระหวาง Variable และ DataType

1 var variable:datatype = 0

Data Type ประเภท Number จะม

1 var x:Int = -100

2 var y:UInt = 100

3 var z:Float = 3.14

4 var t:Double = 100.000000000011

5 var i:Bool = true //true==1,false==0

แบบนคอเราเลอกเองเลยวาจะจะเอา Data Type อะไรและจะเปลยนอกไมได

Page 9: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basics 4

..

Noteเราสามารถใช ; คนระหวางโคด หรอตอนจบบรรทดได เชน var x=100; var y=200

Naming Constants and Variables

เราสามารถสราง variable ดวยหนงสอไดดวยเชนกน แตแนะนำใหใชภาษาองกฤษเปนหลก (PDF version อาจจะไมเหฯตวหนงสอภาษาญปน)

1 var ตวแปร = 3.14

2 var ���� = "ตวอะไร?"

Comments

การ comment ใน Swift นนเหมอนการ comment ใน C, Java, Javascript ตวอยางเชน

1 // one line comment

2

3 /* Start Block comment

4 Hello hello this is comment

5 End Block comment */

Printing Constants and Variables

การสงให log คานนใชคำสง println ตวอยางเชน

1 let n = 100

2 println(n) //prints 100

3 println("Value of n is \(n)") //prints "Value of n is 100"

ใหสงเกตวา Format String ของ Swift จะใชเครองหมาย \(variable) โดยท variable เปนสงทเราตองการแทนคาลงไปใน String

Semicolons

Swift ปรกตแลวจะไมใชเครองหมาย ; semicolon ในการปดบรรทด แตถามความจำเปน จะใสกไดเชน

Page 10: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basics 5

1 let name = "SaKKo";

2 let book = "Swift"; let language = "Thai"

Integers

Integer คอ ตวเลขจำนวนเตมทไมมจดทศนยม เชน 100 หรอ -23

Integer สำหรบ Swift นนใชชอเรยกเหมอน C และมทง signed กบ unsigned 8,16,32,64 bits ตวอยางคอ Int32, UInt8

..

NoteSigned = ตดลบได, Unsigned = ตดลบไมได

Interger Bounds

เพอปองกนการใชคาเกนกำหนดของแตละ Data Type เราสามารถด limit ของแตละ data type ได

1 let minValue = UInt8.min // จะได 0

2 let maxValue = UInt8.max // จะได 255

..

Noteไมควรใชเกนเพราะอาจจะ Overflow และควรจะคดใหรอบคอบกอนเลอกใช Data Type ดวยตนเอง

Int

ในเคสทวๆไป เราไมมความจำเปนทจะตองไปเลอกขนาดของ Data Type เราสามารถเลอกใช Int ไดทนท โดยท Int จะเลอกใชตาม CPU + OS bit ของDevice เชน

• iPhone5s ใช iOS 64bits จะใช Int64• iPhone5 ใช iOS 32bits จะใช Int32

Page 11: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basics 6

..

Noteถาไมมความจำเปนจะตองเลอก size ของ Int แนะนำใหใช Int แบบธรรมดาจะดทสด

UInt

UInt นนถกใชในบางเคสทเราไมตองการให Int ของเราเปนคาตดลบเดดขาด

..

Noteแตวา Document ของ Apple แนะนำใหหลกเลยงการใช UInt และกลบไปใช Int แทน แมวาเราจะมนใจวาคาของ variable นไมมทางตดลบกตามการทำแบบนเปนการชวยเรอง Interoperability ของ Number Types หลายๆแบบ

Floating-Point Numbers

กรณทตวเลขของเรามจดทศนยม เชน 3.1459 เราจะใช Data Type ประเภท Floating Point (ไมไดใช CPU + OS bit เหมอน Int)

• Float 32 bits Floating Points• Double 64 bits Floating Points

..

NoteDouble สามารถเกบทศนยมไดถง 15 จด แต float จะทำไดแค 6 จดเทานน

Type Safety and Type Interference

Swift เปนภาษาทใช Type Safety หมายความวา Swift ตองการให programmer มนใจวาจะทำงานกบ Data ประเภทไหนเสมอ เพอปองกนการสงคาของ Object ทไมตรงกนเชน สง Int ไปใชงานกบ String

เนองจากวา Swift เปน Type Safe, ทกๆครงท program compile, Swift จะไปเชค Type ทกๆครงและแสดงใหเหนวาม code ตรงสวนไหนทมการสงคาผดพลาดบาง

Page 12: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basics 7

Swift เปน Type Safety กจรง แตวาเราไมจำเปนตองรวาเรากำลงใชงาน Type อะไรอย เราสามารถ let อะไรซกอยางแลวให Swift เลอกใหวา เปนType อะไรไดดวยตว Swift เอง หรอเรยกวา Type Interference ทกครงท compile, Swift จะเลอก Type ใหตามคาของสงทเราพยายามจะใชงาน

ตวอยาง

1 let apples = 42 // inferred type Int

2 let pi = 3.14159 // inferred type Double

3 let newPi = 3 + 0.14159 // inferred type Double

..

NoteSwift จะเลอก Type Double เสมอ จะไมเลอก Type Float ใหแมวาเลขทศนยมจะนอยกตาม

Nummeric Literals and Conversion

ตอมา ถาตองการใชตวเลขนอกเหนอจาก decimal (ฐาน 10) let decimalInter = 17 // 17 ฐาน 10 let binaryInteger = 0b10001 // 17 ฐาน 2 ใหเรมดวย 0b let octalInteger = 0o21 // 17 ฐาน 8 ใหเรมดวย 0o let hexadecimalInteger = 0x11 // 17 ฐาน 16 ใหเรมดวย 0x

เลขทคณดวย 10 ยกกำลง

1 1.33e5 จะได 1.33*10^5 หรอ 133,000

2 1.33e-2 จะได 1.33*10^-2 หรอ 0.0133

Swift จะ auto convert type ให เชน

1 let a = 0x11 //17

2 let b = 3 //3

3 let c = a-b //14

สงเกตวา a เปน hex และ b เปน decimal แตนำมา - กนไดปรกต

Integer (and Floating Point) Conversion

ถาเราเลอกใช Data Type อยางใดอยางหนงแลว ตองใชใหถกตองและไมเกนขอจำกดของ Type นนๆ (Swift จะแสดง error message) เชน

Page 13: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basics 8

1 let a:UInt8 = -10 // ไมได เพราะวาเปน unsigned Int หามตดลบ

2 let b:Int16 = Int16.max+1 // ไมได เพราะวาเกน Max ไปแลว 1

เราสามารถแปลงจาก Double < - > Int ไดทงสองทาง แตตองเขาใจถงการเปลยนแปลงของ Data ดวย

1 let a = 3 // Int

2 let b = Double(3) // จะกลายเปน Double หรอ 3.0

3 let c = Int(3.01) // จะได 3

4 let d = Int(3.99) // กยงได 3

..

Noteใหสงเกตวา ไมมการปดเลขขนแตอยางใด เชน Int(3.99) จะไมปดเปน 4

Type Aliases

สมมตวาเราอยากสรางตวแปรใหชอของ Data Type (อาจจะมองไมเหนภาพ ดตวอยาง)

1 // ตงคาคำวา MaximumColorCode เทยบเทากบ UInt8

2 typealias MaximumColorCode = UInt8

3

4 // เทยบเทากบเรยก UInt8.min

5 var myStartingColor = MaximumColorCode.min

Booleans

Boolean หรอวา Bool ใน Swift นนเกบคาดวยคำวา true หรอ false (ตวเลกหมด) ตวอยาง

1 var isThailandHot = true // auto assigned by swift

2 var isThailandCold:Bool = false // assign type เอง

Boolean มประโยชนหลายอยางมาก แตทจะใชงานบอยทสดกคอเมอเราตองการเขยน conditional statement ยกตวอยางเชน if else

Page 14: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basics 9

1 if isThailandHot {

2 println("อยากไปเทยว ��� จง")

3 } else {

4 println("เออ มนจะไมรอนไดยงไง?")

5 }

เรองของ conditional statement นนเราจะพดถงในบทของ Control Flow

ภาษาอนๆ เราจะใช 1/0 แทน true/false ได แตวาสำหรบ Swift โปรแกรมจะไม Compile ถาเราใช 1/0 สำหรบ Boolean ตวอยางเชน

1 let i = 1

2 if i {

3 // โปรแกรมจะฟองวาม error เพราะวา i ไมใช Boolean

4 }

แตเราสามารถใชการเปรยบเทยบคาได เชน

1 let i = 1

2 if i==1 {

3 // โปรแกรมจะ compile ผาน

4 }

เครองหมาย == นนเปน Operator สำหรบเปรยบเทยบคาซงเราจะพดถงในบทของ Basic Operators

..

Noteภาษา Swift เปน Type Safety, จงทำให true นนไมเทากบ 1 และทำใหการเขยนโคดนน programmer จะตองมนใจกบสงทเขยนจรงๆ

Tuples

Tuples เปนการ group รวมหลายๆอยางเขาหากน เชน (Int,String) หรออาจจะมากกวาสองอยาง เชน (Int,String,String,Double,Float)

Tuples สามารถนำไปใชไดหลากหลาย โดยท Apple ไดยกตวอยางเปนการใช Tuples กบ HTTP Error Code (404)

1 let http404Error = (404,"Not Found")

เมอเราสราง Tuples เขามาแลว เราสามารถดงคาออกมาใชงานไดโดย

Page 15: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basics 10

1 let (statusCode, statusMessage) = http404Error

เราสามารถดงคาของ Tuples ออกมาใชจากตวแปรใหมไดโดยตรง

1 var code = statusCode // เทากบเอา 404 ออกมาจาก http4

2 var message = statusMessage // เทากบเอา "Not Found" ออกมาจาก http404Error

สมมตวาเราม Tuples อยแตวาเราตองการแคคาแรกใน Tuples เทานน เราสามารถใชเครองหมาย _เพอบอกให Swift รวาเราไมตองการคาอนๆไดตวอยางเชน

1 let http404Error = (404,"Not Found","Another Message","[email protected]")

2 //เราตองการแค 404

3 let (onlyStatusCode,_) = http404Error

4 // ดง status code มาใชงาน

5 var code = onlyStatusCode

_ จะไมสนใจวามคาอนๆใน Tuples อกหรอไม ทำใหสามารถใชงาน Tuples ไดงายขน

แตเนองจากวาโครงสรางของ Tuples นนจะคลายกบรปแบบของ Array ทำใหเราสามารถเรยกใชโดย index ไดเชน

1 let http404Error = (404,"Not Found","Another Message","[email protected]")

2 var statusCode = http404Error.0 // จะได 404

3 var email = http404Error.3 // จะได "[email protected]"

หรอหากวาเราตองการจะเปลยนจากการใช index เปนการใช “key” กใชไดเชนกน

1 let http202Status = (statusCode: 200, description: "OK")

2 var myPageStatus = http202Status.statusCode // จะได 200

3 var myPageDesc = http202Status.description // จะได "OK"

Tuples นนมประโยชนหลายอยางซงสงทใชงานบอยนาจะเปนสวนของ Web Page ทอาจจะมการสงคามาเปน (Int,String) เชนตวอยาง 404 ขางบน

Tuples นนจะมประโยชนมากขนเมอใชงานรวมกบ Function ตางๆ เพราะวาจะสามารถทำให Function นนๆสามารถ return multiple values ในการ call 1 ครงได

..

NoteTuples นนเหมาะสำหรบ Data Structure แบบไมซบซอน หากจำเปนตองใช Data Structure หลาย level มากขน ควรจะอานเรองการใชงาน Classเพมเตมในบทตอไป

Page 16: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basics 11

..

Optionals

การใช optionals นนจะใชกตอเมอ คาของสงทเราจะใชนนมโอกาสทจะเปนคาวางเปลา ยกตวอยางเชน

1 ของบางอยางมคาอยและของชนนนมคาเทากบ x

2 หรอ

3 ไมมของใหเปรยบเทยบเลย

..

WarningConcept นไมมอยใน Objective C มากอน สงทใกลเคยงกบ optional ทสดคอ NSNotFound, Optional เปนการเชค value ของอะไรกตาม และดวาสงทเราตองการจะใชนน มใหใชงานจรงหรอไม

ตวอยางท Apple ยกมากคอ เวลาทเราจะแปลง String เปน Int เราจะใชคำสง toInt, ซงไมใชวาทกๆ String จะสามารถแปลงเปน Int ได ดตวอยางขางลาง

1 let someNumberString = "1234"

2 let convertedNumber = someNumberString.toInt()

3

4 let someString = "hello,world"

5 let cannotConvertNumber = someString.toInt()

ในตวอยางน convertedNumber นนจะมคาเทากบ 1234 เพราะวาสามารถแปลงคาจาก String มาเปน Int ได แตวา convertedNumber นนมโอกาสทจะแปลงคาไมไดดวยเหมอนกบ cannotConvertNumber ทำใหเราเรยก type พเศษนวา optional Int หรอใชเครองหมาย Int? ตอทายนนเอง

If Statements and Forced Unwrapping

เราสามารถนำ if มาใชรวมกบ optional ได ซงการใช if นนเปรยบเหมอนกบการถามวาม value อยใน variable นนๆหรอไม

เมอเราตองการจะใช optional ทเราไดหลงจากการแปลงคาดวยคำสง toInt นน เราจะตองใสเครองหมาย ! เพอยนยนการใชงานจรง เครอง ! เปรยบเสมอนเครองหมายทเราจะยนยนวาเรารวาตวแปรนมขอมลแนนอน

Page 17: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basics 12

1 let someNumber = "123"

2 let convertedNumber = someNumber.toInt()

3 if convertedNumber {

4 println("\(someNumber) is converted to \(convertedNumber!)")

5 } else {

6 println("\(someNumber) could not be converted to Int.")

7 }

..

Noteใหสงเกต \(convertedNumber!) จะมเครองหมาย ! อยดวย

..

Warningถาเราใชงาน ! กบ optionals ทไมมคาอยขางใน จะทำใหเกด Runtime Error, ฉะนนจะตองมนใจเสมอวา optionals นนๆมคาจรงๆกอนใช !

Optional Binding

สวนใหญแลว เวลาเขยน Objective C (หรอภาษาอนๆ) เรามกจะมการดงคาอะไรบางอยางทเราตองการออกมาเทสกอนทจะนำไปใชงานจรง เชน

1 //javascript

2 var someNumber = "1234";

3 var actualNumber = Number(numberString);

4 if (actualNumber) {

5 //do something

6 }

ใน Swift เราสามารถทำแบบนไดโดยงาย โดยการใช Optional Binding ตวอยางเชน

Page 18: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basics 13

1 //Swift

2 let someNumber = "1234";

3 if let actualNumber = someNumber.toInt() {

4 // นำ actualNumber มาใช ตอเมอ someNumber.toInt()

5 // เปน optional ทใชงานได

6 // actualNumber ใน if นจะมคาแนนอน ทำใหไมจำเปนตองใช `!`

7

8 println("\(someNumber) is now converted to \(actualNumber)")

9 }

วธการอานกคอ “ถา optional Int ทไดมาจาก someNumber.toInt() นนมาคาใชงานไดจรง ใหนำคานนไปตงชอวา actualNumber”

ใน optional binding นน เราสามารถใช constant หรอ variable กได หากเราไมตองการจะแกไขคา กใหใช let หรอถาตองการแกไขคาไดกใหใช var แทน

nil

การทำใหขอมลวางเปลานน เราจะให variable นนๆเทากบ nil

1 var myAge: Int? = 18

2 myAge = nil

ในกรณน myAge จะเปรยบเสมอนไมมคาอยใหใชงาน

..

Notenil จะไมสามารถนำมาใชกบ variable ทไมใช optional ได หากม variable อะไรกตามทอาจจะไมมคาใหใชงาน เราจะตองใช optional เสมอ ใหสงเกตวา เวลาสราง variable ทตองการจะใหเปน optional เราจะใสเครองหมาย ? ตอทายท variable นนๆ

ยกตวอยางการสราง optional variable

1 var myNickname: String?

2 // myNickname จะถกสรางเปน nil ตงแตเรมตน

3 // คลายกบการสรางแบบน

4 var myNicename1: String? = nil

Page 19: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basics 14

..

Warningnil ใน Swift นนจะไมเหมอน nil ใน Objective C. nil ใน Objective C จะเปรยบเสมอนกบการนำ pointer ชไปททไมม object อะไรอยเลย แตวา nilใน Swift นนไมใช pointer แตเปนคาวางเปลา ซงสามารถใชงานกบ DataType อะไรกได ไมจำเปนตองเปน object อยางเดยว

ตวอยางของ nil ใน Objective C

1 NSString *myString = @"hello";

2 myString = nil; // ชไปทวางเปลา

3

4 int myNumber = 100;

5 myNumber = nil; // เขยนแบบนไมได เพราะ int ไมใช object type

ตวอยางของ nil ใน Swift

1 let myString: String? = "hello"

2 myString = nil // เปนการ reset คาของ myString ใหวางเปลา

3

4 let myNumber: Int? = 100

5 myNumber = nil // เปนการ reset คาของ myNumber ใหวางเปลา

6 // ไมสนใจวา myNumber จะเปน Object หรอเปน premitive data type

Implicitly Unwrapped Optional

หลงจากทไดอธบายเรอง optionals ไปแลวนน เราทราบวา optionals เปนการอนญาตให variable ทสรางขนมานน สามารถเปนคาวางเปลาได และoptionals ยงสามารถถกนำไปเชคคาใน if เพอใชงานตอเมอ optional นนๆมคาไดอกดวย

แตวา การทเราใช optionals นนบางท เรามนใจเสมอวา หลงจากการทเราไดคาออกมาใชงานครงแรกแลว variable นนจะไมเปน nil อกตอไป และเรากอาจจะสามารถบอกไดวา variable นไมมวนทจะเปน nil เลยใน application ของเรา

การทม optionals ประเภททมคา 100% อยใน application เรานน อาจจะทำใหการใสเครองหมาย ! เปนเรองทวนวาย Swift มวธใหเรายกเลกการใชเครองหมาย ! ทงหมดไดโดยงาย ซงจะถกเรยกวา Implicitly Unwrapped Optional

โดยทตอนทสราง optional เราจะไมใชเครองหมาย ? เพอสราง optional แตเราจะใช ! ตงแตตอนสรางเลย ยกตวอยางเชน

Page 20: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basics 15

1 let myNickname: String? = "SaKKo" // สราง optional

2 println("Hello \(myNickname!)")

3 // ใชเครองหมาย ! เพอยนยนคา optional วามอยจรง

4

5

6 let myFirstname: String! = "Tanasak" // สราง implicitly unwrapped optional

7 // ใช myFirstname ไดเลยโดยทไมตองใส ! เพราะวาตอนเราสราง

8 // เรามนใจอยแลววา myFirstname จะมคาโดยการสรางดวย syntax (: String!)

9 println("Hello \(myFirstname)")

การใช implicitly unwrapped optional นนจะมประโยชนกตอเมอเราใชมนกบ optional ทเรามนใจวาจะมคาทนทหลงจากท optional นนถกสรางและจะมคาตลอดไป

เราสามารถมอง implicitly unwrapped optional วาเปนการอนญาต ให เราไมตองพมเครองหมาย ! ตลอดเวลากได เพอความสะดวกในการเขยนโปรแกรม

..

Warningแตวาถา implicitly unwrapped optional ของเรานนเกดเปนคา nil ขนมา เมอเราพยายามทจะใชคาของมน จะทำใหเกด runtime error เหมอนกบตอนทเราใช ! กบ optional แบบปรกตนนเอง

..

Noteเราไมควรจะใช implicitly unwrapped optional เดดขาด ถาหากวาคาของ optional นนๆมโอกาสทจะเปนคาวางเปลา

Assertions

optionals นนสามารถทำใหเราเขยนโปรแกรมโดยทดวา จะนำคามาใชงานกตอเมอม value อยจรง และพยายามทจะหลกเลยงคาบางอยางทเปน nil ได

แตวาบางทแลว การทโคดของเราตองการจะใชคาอะไรกตามแลวหาคาๆนนไมเจอ เราอาจจะตองการทจะรโดยทนท และเขาไปดหรอ debug คานนได

Swift มการใช Assert เพอทจะให programmer สามารถรไดวามคาบางอยางขาดหายไป หรอผดแปลกไป และเขาไป debug application ของเราได

Debugging with Assertion

Assertion นนจะคอยมองหาคาทเปน true เสมอ โดยทจะมการทำงานดงน

Page 21: Thai Swift - Leanpubsamples.leanpub.com/ThaiSwift-sample.pdf · อหาของหน งส อและการนำไปข อม ลไปใช งาน น นให

The Basics 16

1. เชควา assertion เปน true หรอไม 1.1 ถาเปน true โปรแกรมจะทำงานตอได 1.2 ถาเปฯ false โปรแกรมจะไมทำงานตอ application จะถกปดตวลง

ถา application ของเราอยใน debugging mode ของ Xcode, เราจะสามารถดไดเลยวา โปรแกรมของเราผดทสวนไหน และดวยคาอะไร ณ จงหวะทassertion ถกเรยก โดยท assertion ยงสามารถใหเราเลอกขอความทเราอยากใสไดดวย

ตวอยางเชน

1 var height = 102

2 assert(height >= 0, "A human's height cannot be less than zero.")

3 // assertion ไมถกเรยก เพราะวา height >= 0

4

5 height = -102

6 assert(height >= 0, "A human's height cannot be less than zero.")

7 // assertion จะถกเรยกและ application จะปดตวลง

8 // เพราะวา (height>=0) เปน false และ Xcode จะแสดง

9 // error string ทเรากำหนด

10

11 height = -1

12 assert(height >= 0)

13 // เราสามารถใช assertion เปลาไมตองใสขอความกได

14 // แตแนะนำใหใส จะไดรวาผดเพราะอะไร

When to User Assertion

เราจะใช assertion กตอเมอ สงๆนนมโอกาสทจะเปน false ทงๆทเราตองการทจะใหมนเปน true เสมอ ไมวากรณใดๆกตาม ตวอยางเชน

• การใช integer สำหรบ index โดยท index นนหามเปนคาทนอยกวาหรอเทากบ 0 เดดขาด• การใช integer สำหรบ index โดยท index นนหามมากกวาคาบางคา• การสงคาบางอยางไปใน function โดยทคานนๆจำเปนจะตองเปนคาทถกตองตามทกำหนด• การเชคคา nil โดยทคำสงบางอยาง หามใช nil เดดขาด

..

NoteAssertion นนจะทำให application ปดตวลง โดยทสงททำใหเกด assertion นนควรจะเปนอะไรทมโอกาสเกดขนไดยาก (ถาหากเรา design มาดพอ)แตวาถาหากมนเกดขนแลว assertion จะมประโยชนมากๆในการชวยใหเราหาบคของแอพเราไดรวดเรวขน