Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
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
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
Swift เปน programming language ใหมทคดคนโดย Apple และจะกลายเปนภาษาหลกทใชเขยนโปรแกรมสำหรบ iOS และ OS X ในอนาคต
เปาหมายของหนงสอเลมนคอ เปนหนงสอทเกบรวบรวมขอมลตางๆเกยวกบ Swift Programming เปนภาษาไทย เพอใหคนไทย เดกไทย ไดศกษาการเขยนโปรแกรมลงบน iOS หรอ Mac ไดโดยงาย
หนงสอเลมน ทำไวเพอแจกฟร หรอ อยในระบบ Donation base หามนำไปพมซำหรอจำหนายโดยเดดขาด หนงสอเลมน เปนหนงสอทเขยนตามความเขาใจของผแตง ทกอยางทอยในหนงสอเลมนอาจจะมขอผดพลาดบางสวนซงผแตงไมรบประกนเนอหาของหนงสอ และการนำไปขอมลไปใชงานนนใหผ
อานเปนผตดสนใจโดยทผแตงจะไมรบผดชอบตอขอผดพลาดใดๆทงสน
เนองจากผเขยนเปนคนทภาษาไทยแยมาก ผมขออภยมาณทนดวย หากทาพบวาเนอหาผดพลาดประการใด ผมยนดทจะแกไขใหถกตองครบ หากทานพบวาหนงสอเลมนมประโยชน อยากสนบสนน หรออยากชวยเพมเตมขอมล ตดตอผมไดท [email protected] จะพยายามตอบกลบใหเรวทสดครบ
ขอบคณครบ
สารบญ
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
สารบญ 1
เรยนผอาน หนงสอเลมนกำลงอยระหวางการปรบปรงเนอหา การปรบปรงเนอหารอบน จะเปนการปรบปรงโดยการเปลยนจากการแปลหนงสอ เปนการเรยบเรยงเนอหาใหมโดยผแตง เพอใหภาษาเปนทางการมากขนและเขาใจงายขนครบ
คาดวาจะปรบปรงบท 1 และ 2 แลวเสรจในชวงกลางเดอนสงหาคมครบ
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 สามารถเปลยนคาได)
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 อะไรและจะเปลยนอกไมได
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 ในการปดบรรทด แตถามความจำเปน จะใสกไดเชน
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
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 ตรงสวนไหนทมการสงคาผดพลาดบาง
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) เชน
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
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 เขามาแลว เราสามารถดงคาออกมาใชงานไดโดย
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เพมเตมในบทตอไป
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 นน เราจะตองใสเครองหมาย ! เพอยนยนการใชงานจรง เครอง ! เปรยบเสมอนเครองหมายทเราจะยนยนวาเรารวาตวแปรนมขอมลแนนอน
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 ตวอยางเชน
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
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 แตเราจะใช ! ตงแตตอนสรางเลย ยกตวอยางเชน
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 เสมอ โดยทจะมการทำงานดงน
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 จะมประโยชนมากๆในการชวยใหเราหาบคของแอพเราไดรวดเรวขน