การผูกเพิ่มเติม
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
จะส่งคืนfalse
if booleanValue
is 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?
ฯลฯ )