ก่อนที่ฉันจะสามารถอธิบายกรณีการใช้งานสำหรับตัวเลือก Unwrapped Option โดยปริยายคุณควรเข้าใจว่า Optionals และ Option ที่ไม่ได้รับการระบุโดยนัยอยู่ใน Swift ถ้าคุณทำไม่ได้ฉันขอแนะนำให้คุณอ่านบทความของฉันเป็นตัวเลือก
เมื่อใดที่จะใช้ตัวเลือก Unwrapped โดยนัย
มีเหตุผลหลักสองประการที่จะสร้างตัวเลือก Unplicitly Unwrapped ทุกคนเกี่ยวข้องกับการกำหนดตัวแปรที่จะไม่สามารถเข้าถึงได้เมื่อใดก็ตามnil
เพราะมิฉะนั้นคอมไพเลอร์ Swift จะบังคับให้คุณทำการแกะตัวเลือกอย่างชัดเจน
1. ค่าคงที่ที่ไม่สามารถกำหนดได้ในระหว่างการเริ่มต้น
ค่าคงที่สมาชิกทุกคนต้องมีค่าโดยการกำหนดเวลาให้เสร็จสมบูรณ์ บางครั้งค่าคงที่ไม่สามารถเริ่มต้นได้ด้วยค่าที่ถูกต้องในระหว่างการเริ่มต้น แต่ก็ยังสามารถรับประกันได้ว่าจะมีค่าก่อนที่จะเข้าถึง
การใช้ตัวแปรทางเลือกจะแก้ไขปัญหานี้เนื่องจากตัวเลือกถูกเตรียมใช้งานโดยอัตโนมัติnil
และค่าที่จะมีในที่สุดจะยังคงไม่เปลี่ยนรูป อย่างไรก็ตามอาจเป็นความเจ็บปวดที่จะคลายตัวแปรอย่างต่อเนื่องที่คุณรู้ว่าไม่ใช่ศูนย์ ตัวเลือก Unwrapped โดยนัยจะได้รับผลประโยชน์เช่นเดียวกับทางเลือกพร้อมสิทธิประโยชน์เพิ่มเติมซึ่งไม่จำเป็นต้องแกะออกมาอย่างชัดเจนทุกที่
ตัวอย่างที่ดีของสิ่งนี้คือเมื่อตัวแปรสมาชิกไม่สามารถเริ่มต้นในคลาสย่อย UIView จนกว่าจะโหลดมุมมอง:
class MyView: UIView {
@IBOutlet var button: UIButton!
var buttonOriginalWidth: CGFloat!
override func awakeFromNib() {
self.buttonOriginalWidth = self.button.frame.size.width
}
}
ที่นี่คุณไม่สามารถคำนวณความกว้างดั้งเดิมของปุ่มได้จนกว่ามุมมองจะโหลด แต่คุณรู้ว่าawakeFromNib
จะมีการเรียกใช้ก่อนวิธีอื่น ๆ ในมุมมอง (นอกเหนือจากการเริ่มต้น) แทนที่จะบังคับให้ค่านั้นไม่ได้เปิดทิ้งอย่างไร้จุดหมายทั่วชั้นเรียนของคุณคุณสามารถประกาศว่าเป็นตัวเลือก Unwrapped โดยนัย
2. เมื่อแอพของคุณไม่สามารถกู้คืนจากการเปลี่ยนแปลงได้ nil
นี้ควรจะหายากมาก แต่ถ้าแอปของคุณไม่สามารถทำงานต่อไปถ้าตัวแปรเมื่อเข้าถึงก็จะเสียเวลาไปรบกวนการทดสอบหาnil
โดยปกติถ้าคุณมีสภาพที่แน่นอนจะต้องเป็นจริงสำหรับแอปของคุณทำงานต่อไปคุณจะใช้nil
assert
ตัวเลือก Unwrapped โดยนัยมีการยืนยันว่าไม่มีบิวด์ติดอยู่ ถึงอย่างนั้นมันก็มักจะดีที่จะแกะตัวเลือกและใช้การยืนยันที่มีรายละเอียดมากขึ้นถ้ามันเป็นศูนย์
เมื่อไม่ต้องการใช้ตัวเลือก Unwrapped โดยนัย
1. ตัวแปรสมาชิกคำนวณอย่าง Lazily
บางครั้งคุณมีตัวแปรสมาชิกที่ไม่ควรเป็นศูนย์ แต่ไม่สามารถตั้งค่าเป็นค่าที่ถูกต้องระหว่างการเริ่มต้น ทางออกหนึ่งคือการใช้ Unwrapped ตัวเลือกโดยนัย แต่วิธีที่ดีกว่าคือการใช้ตัวแปรสันหลังยาว:
class FileSystemItem {
}
class Directory : FileSystemItem {
lazy var contents : [FileSystemItem] = {
var loadedContents = [FileSystemItem]()
// load contents and append to loadedContents
return loadedContents
}()
}
ตอนนี้ตัวแปรสมาชิกcontents
จะไม่เริ่มต้นจนกว่าจะมีการเข้าถึงครั้งแรก สิ่งนี้จะช่วยให้ชั้นเรียนมีโอกาสเข้าสู่สถานะที่ถูกต้องก่อนที่จะคำนวณค่าเริ่มต้น
หมายเหตุ:สิ่งนี้อาจขัดแย้งกับ # 1 จากด้านบน อย่างไรก็ตามมีความแตกต่างที่สำคัญที่จะทำ buttonOriginalWidth
ดังกล่าวข้างต้นจะต้องตั้งค่าในช่วง viewDidLoad เพื่อป้องกันไม่ให้คนเปลี่ยนปุ่มกว้างก่อนที่ทรัพย์สินที่มีการเข้าถึง
2. ทุกที่อื่น
ส่วนใหญ่โดยปริยายแกะ optionals ควรหลีกเลี่ยงเพราะถ้าใช้ผิดพลาด, app nil
ทั้งหมดของคุณจะมีปัญหาเมื่อมีการเข้าถึงในขณะที่ หากคุณไม่แน่ใจว่าตัวแปรสามารถเป็นศูนย์ได้หรือไม่ให้ใช้ค่าเริ่มต้นปกติเป็นตัวเลือกเสมอ การคลายตัวแปรที่ไม่เคยเกิดขึ้นnil
อย่างแน่นอนไม่ทำให้เจ็บปวดมาก
if someOptional
คุณสามารถใช้อีกต่อไป