การผูกเพิ่มเติม
Swift 3 และ 4
var booleanValue : Bool? = false
if let booleanValue = booleanValue, booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
Swift 2.2
var booleanValue : Bool? = false
if let booleanValue = booleanValue where booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
โค้ดlet booleanValue = booleanValueจะส่งคืนfalseif booleanValueis nilและifบล็อกไม่ทำงาน หากbooleanValueไม่เป็นnilเช่นนั้นรหัสนี้จะกำหนดตัวแปรใหม่ชื่อbooleanValueประเภทBool(แทนที่จะเป็นทางเลือกBool?)
โค้ด Swift 3 & 4 booleanValue(และโค้ด Swift 2.2 where booleanValue) จะประเมินbooleanValue: Boolตัวแปรใหม่ หากเป็นจริงifบล็อกจะดำเนินการกับbooleanValue: Boolตัวแปรที่กำหนดใหม่ในขอบเขต (อนุญาตให้อ็อพชันอ้างอิงค่าที่ถูกผูกไว้อีกครั้งภายในifบล็อก)
หมายเหตุ: เป็นแบบแผนของ Swift ในการตั้งชื่อค่าคงที่ / ตัวแปรที่ถูกผูกไว้เหมือนกับค่าคงที่ / ตัวแปรทางเลือกเช่นlet booleanValue = booleanValue. เทคนิคนี้เรียกว่าแชโดว์ตัวแปร let unwrappedBooleanValue = booleanValue, unwrappedBooleanValueคุณสามารถทำลายจากการประชุมและใช้สิ่งที่ต้องการ ฉันชี้ให้เห็นสิ่งนี้เพื่อช่วยให้เข้าใจว่าเกิดอะไรขึ้น ฉันขอแนะนำให้ใช้การสร้างเงาตัวแปร
แนวทางอื่น ๆ
ไม่มีการรวมตัวกัน
การรวมกันของ Nil นั้นชัดเจนสำหรับกรณีนี้โดยเฉพาะ
var booleanValue : Bool? = false
if booleanValue ?? false {
print("optional booleanValue: '\(booleanValue)'")
}
การตรวจสอบfalseไม่ชัดเจนเท่า
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
print("optional booleanValue: '\(booleanValue)'")
}
หมายเหตุ: if !booleanValue ?? falseไม่ได้รวบรวม
บังคับให้คลายตัวเลือก (หลีกเลี่ยง)
การบังคับให้แกะกล่องเพิ่มโอกาสที่ใครบางคนจะทำการเปลี่ยนแปลงในอนาคตที่คอมไพล์ แต่ขัดข้องขณะรันไทม์ ดังนั้นฉันจะหลีกเลี่ยงสิ่งนี้:
var booleanValue : Bool? = false
if booleanValue != nil && booleanValue! {
print("optional booleanValue: '\(booleanValue)'")
}
แนวทางทั่วไป
แม้ว่าคำถามเกี่ยวกับสแต็กล้นนี้จะถามถึงวิธีการตรวจสอบว่า a Bool?อยู่trueในifคำสั่งโดยเฉพาะหรือไม่ แต่การระบุวิธีการทั่วไปว่าจะตรวจสอบหาจริงเท็จหรือรวมค่าที่ไม่ได้ใส่ไว้กับนิพจน์อื่น
เมื่อนิพจน์มีความซับซ้อนมากขึ้นฉันพบว่าแนวทางการผูกทางเลือกมีความยืดหยุ่นและเข้าใจง่ายกว่าวิธีอื่น ๆ โปรดทราบว่าการทำงานที่มีผลผูกพันกับตัวเลือกเลือกประเภทใด ๆ ( Int?, String?ฯลฯ )