ตัวเลือกจะตั้งค่าหรือไม่ได้ตั้งค่า (ไม่ใช่ศูนย์หรือศูนย์) ... ปล่อยให้เรามีการตัดสินใจที่สำคัญ "เราควรเขียนโค้ดของเราอย่างไรเพื่อให้สามารถทำงานได้อย่างถูกต้องสำหรับ 2 สถานะทั้งสอง". วิธีที่เราแกะตัวเลือกคือสิ่งที่ตัดสินใจสำหรับเรา
มีหลายวิธีที่คุณสามารถใช้เพื่อตอบโต้ตัวเลือกที่ไม่ได้ตั้งค่า
- พัง!
- ตั้งค่าเริ่มต้นเป็นบางสิ่ง - หากไม่ได้ตั้งค่าไว้
- ล้มเหลวอย่างสง่างามคือไม่ต้องทำอะไรเลย แต่ถ้าตั้งค่าแล้วให้กำหนดค่านั้น
- ล้มเหลวอย่างสง่างามคือไม่ต้องทำอะไรเลยอย่างไรก็ตามหากตั้งค่า ... ทำบางสิ่งบางอย่าง (มันเป็นมากกว่าการมอบหมายงานเดียว)
ด้านล่างนี้คือ 4 แนวทาง
การใช้บังคับแกะกล่องจะขัดข้องหากคุณไม่มีค่า คุณจะต้องทำเช่นนี้หากค่านั้นมีความสำคัญอย่างยิ่งเช่นชื่อภาพยนตร์ (ภาพยนตร์ทุกเรื่องต้องมีชื่อ) !
ใช้สำหรับบังคับแกะ
movieTitle = movie.title!
การใช้nil coalescingเป็นอีกวิธีหนึ่งที่จะช่วยให้คุณควบคุมได้มากขึ้นซึ่งหมายความว่าจะไม่ผิดพลาดหากไม่ได้ตั้งค่าและจะ 'ไม่ตั้งค่าอะไรเลย' หากไม่ได้ตั้งค่า ... มันจะทำตามที่คุณบอก ที่จะทำเช่นมันจะเริ่มต้น / ตั้งชื่อของภาพยนตร์เป็น untitled_movieหากไม่มีการตั้งชื่อ ??
ใช้สำหรับการรวมกันเป็นศูนย์
var movieTitle = movie.title ?? "untitled_Movie"
การใช้Chaining เสริมจะไม่ทำอะไรเลยหากคุณไม่มีค่าและจะกำหนดค่าหากคุณมีค่า คุณทำสิ่งนี้เพื่อบางสิ่งบางอย่างที่การกำหนดค่าของมันไม่ได้มีความสำคัญอย่างยิ่งเช่นการตั้งชื่อตัวแทนนักแสดงของคุณ ?
ใช้สำหรับโซ่เสริม
let agent = movie.leadActor?.agent
let agent = movie.leadActor!.agent
การใช้if-let
(หรือการเชื่อมโยงที่เป็นทางเลือกguard
สองประเภทที่แตกต่างกัน) จะทำให้คุณควบคุมได้มากขึ้นและจะไม่ผิดพลาดหากไม่ได้ตั้งค่าไว้ หากตั้งค่าแล้วคุณสามารถทำบางสิ่งได้ หากยังไม่ได้ตั้งค่าคุณสามารถเพิ่มคำสั่งได้else
if let supportingActor = movie.supportingActor{
print(" The supporting actor is \(supportingActor)}
นี่เป็นวิธีการแกะที่ใช้กันมากที่สุดเนื่องจากการบังคับให้แกะห่อค่อนข้างไม่ดี สำหรับการอภิปรายเพิ่มเติมเกี่ยวกับเหตุผลที่มันเป็นกำลังใจดูที่นี่ สำหรับการเปรียบเทียบที่ดีระหว่างguard
และif-let
ดูguard vs. if-let
หมายเหตุด้านข้าง:
โดยทั่วไปจะใช้การผูกเสริมและการผูกมัดเสริมร่วมกัน:
if let agent = movie.leadActor?.agent {
ContactInfo = agent.phoneNumber
}