มุมมองภาพใหญ่เพื่อเพิ่มคำตอบที่เป็นประโยชน์ แต่มีรายละเอียดมากขึ้น:
ใน Swift จุดอัศเจรีย์ปรากฏขึ้นในหลายบริบท:
- บังคับให้แกะออก:
let name = nameLabel!.text
- ตัวเลือกที่ไม่ได้เปิดใช้โดยนัย:
var logo: UIImageView!
- บังคับให้หล่อ:
logo.image = thing as! UIImage
- ข้อยกเว้นที่ไม่สามารถจัดการได้:
try! NSJSONSerialization.JSONObjectWithData(data, [])
สิ่งเหล่านี้ทุกคนมีโครงสร้างภาษาที่แตกต่างกันและมีความหมายแตกต่างกัน แต่พวกเขามีสามสิ่งสำคัญที่เหมือนกัน:
1. เครื่องหมายอัศเจรีย์หลีกเลี่ยงการตรวจสอบความปลอดภัยเวลารวบรวมของ Swift
เมื่อคุณใช้!
ในสวิฟท์, คุณจะได้เป็นหลักบอกว่า“Hey, คอมไพเลอร์, ฉันรู้ว่าคุณคิดว่ามีข้อผิดพลาดที่อาจเกิดขึ้นที่นี่ แต่ฉันรู้ว่าด้วยความเชื่อมั่นรวมว่ามันไม่เคยจะ.”
ไม่ใช่รหัสที่ถูกต้องทั้งหมดที่ใส่ลงในกล่องระบบรวบรวมเวลาของ Swift หรือการตรวจสอบประเภทคงที่ของภาษาใด ๆสำหรับเรื่องนั้น มีสถานการณ์ที่คุณสามารถพิสูจน์ได้อย่างมีเหตุผลว่าข้อผิดพลาดจะไม่เกิดขึ้น แต่คุณไม่สามารถพิสูจน์ได้กับคอมไพเลอร์จะคอมไพเลอร์นั่นเป็นเหตุผลที่นักออกแบบของ Swift เพิ่มคุณสมบัติเหล่านี้ในตอนแรก
อย่างไรก็ตามเมื่อใดก็ตามที่คุณใช้!
คุณจะต้องมีเส้นทางการกู้คืนสำหรับข้อผิดพลาดซึ่งหมายความว่า ...
2. เครื่องหมายอัศเจรีย์อาจล่ม
เครื่องหมายอัศเจรีย์ยังพูดว่า“เฮ้ Swift ผมเพื่อให้แน่ใจว่าข้อผิดพลาดนี้ไม่สามารถเกิดขึ้นว่ามันจะดีกว่าสำหรับคุณที่จะผิดพลาดของแอปทั้งหมดของฉันมากกว่าที่เป็นอยู่สำหรับผมที่จะรหัสเส้นทางสำหรับการกู้คืนมัน.”
นั่นเป็นการยืนยันที่อันตราย มันอาจเป็นรหัสที่ถูกต้อง: ในรหัสภารกิจสำคัญที่คุณคิดอย่างหนักเกี่ยวกับค่าคงที่ของรหัสของคุณอาจเป็นไปได้ว่าผลลัพธ์ปลอมจะเลวร้ายยิ่งกว่าความผิดพลาด
อย่างไรก็ตามเมื่อฉันเห็น!
ในป่ามันไม่ค่อยได้ใช้อย่างมีเหตุผล “ ค่านี้เป็นทางเลือกและฉันไม่ได้คิดหนักเกินไปเกี่ยวกับสาเหตุที่อาจเป็นศูนย์หรือวิธีจัดการสถานการณ์อย่างเหมาะสม แต่การเพิ่ม!
ทำให้คอมไพล์…ดังนั้นรหัสของฉันถูกต้องใช่ไหม”
ระวังความเย่อหยิ่งของเครื่องหมายอัศเจรีย์ แทน…
3. เครื่องหมายอัศเจรีย์ถูกใช้อย่างประหยัดที่สุด
โครงสร้างเหล่านี้ทุกตัว!
มี?
คู่ที่บังคับให้คุณจัดการกับข้อผิดพลาด / ไม่มีกรณี:
- การเปิดเงื่อนไขแบบมีเงื่อนไข:
if let name = nameLabel?.text { ... }
- optionals:
var logo: UIImageView?
- เงื่อนไขปลดเปลื้อง:
logo.image = thing as? UIImage
- ข้อยกเว้น Nil-on-Fail:
try? NSJSONSerialization.JSONObjectWithData(data, [])
หากคุณถูกล่อลวงให้ใช้งาน!
คุณควรพิจารณาอย่างรอบคอบเสมอว่าทำไมคุณไม่ใช้งาน?
แทน การหยุดโปรแกรมของคุณเป็นตัวเลือกที่ดีที่สุดหากการ!
ทำงานล้มเหลว เหตุใดค่าจึงเป็นตัวเลือก / พร้อมใช้งาน
มีเส้นทางการกู้คืนที่สมเหตุสมผลรหัสของคุณอาจใช้ในกรณีที่ไม่มี / ข้อผิดพลาด? ถ้าเป็นเช่นนั้นรหัสมัน
หากมันไม่สามารถเป็นศูนย์ได้หากข้อผิดพลาดไม่สามารถเกิดขึ้นได้มีวิธีที่เหมาะสมในการปรับตรรกะของคุณใหม่เพื่อให้คอมไพเลอร์รู้หรือไม่? ถ้าเป็นเช่นนั้นทำมัน; รหัสของคุณจะมีข้อผิดพลาดน้อยลง
มีบางครั้งที่ไม่มีวิธีที่เหมาะสมในการจัดการข้อผิดพลาดและเพียงละเว้นข้อผิดพลาด - และดำเนินการกับข้อมูลที่ไม่ถูกต้อง - จะเลวร้ายยิ่งกว่าการล่ม เหล่านี้เป็นเวลาที่จะใช้กำลังเปิดออก
ฉันค้นหา codebase ทั้งหมดเป็นระยะ!
และตรวจสอบการใช้งานทุกครั้ง ประเพณีน้อยมากที่ยืนขึ้นเพื่อตรวจสอบข้อเท็จจริง (จากการเขียนนี้กรอบงาน Siesta ทั้งหมดมีสอง อินสแตนซ์ของมันอย่างแน่นอน)
ไม่ได้หมายความว่าคุณไม่ควรใช้!
รหัสของคุณ แต่คุณควรใช้อย่างระมัดระวังและไม่ทำให้เป็นตัวเลือกเริ่มต้น