การอ่านบทความนี้ฉันสังเกตเห็นประโยชน์ที่ยอดเยี่ยมในการใช้Guard
ที่นี่คุณสามารถเปรียบเทียบการใช้ยามกับตัวอย่าง:
นี่คือส่วนที่ไม่มีการป้องกัน:
func fooBinding(x: Int?) {
if let x = x where x > 0 {
// Do stuff with x
x.description
}
// Value requirements not met, do something
}
ที่นี่คุณใส่รหัสที่คุณต้องการภายในเงื่อนไขทั้งหมด
คุณอาจไม่เห็นปัญหาทันที แต่คุณสามารถจินตนาการได้ว่ามันจะเกิดความสับสนได้อย่างไรหากเกิดการซ้อนกันด้วยเงื่อนไขมากมายที่จำเป็นต้องได้รับก่อนที่จะเรียกใช้คำสั่งของคุณ
วิธีทำความสะอาดสิ่งนี้คือทำเช็คแต่ละครั้งก่อนออกจากโปรแกรมหากยังไม่เสร็จ สิ่งนี้ช่วยให้เข้าใจได้ง่ายว่าเงื่อนไขใดที่จะทำให้ฟังก์ชันนี้ออก
แต่ตอนนี้เราสามารถใช้ Guard และเราเห็นว่าเป็นไปได้ในการแก้ไขปัญหา:
func fooGuard(x: Int?) {
guard let x = x where x > 0 else {
// Value requirements not met, do something
return
}
// Do stuff with x
x.description
}
- ตรวจสอบเงื่อนไขที่คุณต้องการไม่ใช่เงื่อนไขที่คุณไม่ต้องการ นี้อีกครั้งคล้ายกับการยืนยัน หากไม่ตรงตามเงื่อนไขจะมีคำสั่งอื่นของ Guard ทำงานซึ่งแบ่งออกจากฟังก์ชัน
- หากเงื่อนไขผ่านไปตัวแปรที่เป็นทางเลือกที่นี่จะถูกนำมาห่อให้คุณโดยอัตโนมัติภายในขอบเขตที่คำสั่งป้องกันถูกเรียก - ในกรณีนี้ฟังก์ชัน fooGuard (_ :)
- คุณกำลังตรวจสอบกรณีที่ไม่ดีก่อนเวลาทำให้การทำงานของคุณอ่านง่ายขึ้นและง่ายต่อการดูแลรักษา
รูปแบบเดียวกันนี้ถือเป็นจริงสำหรับค่าที่ไม่จำเป็นเช่นกัน:
func fooNonOptionalGood(x: Int) {
guard x > 0 else {
// Value requirements not met, do something
return
}
// Do stuff with x
}
func fooNonOptionalBad(x: Int) {
if x <= 0 {
// Value requirements not met, do something
return
}
// Do stuff with x
}
หากคุณยังมีคำถามใด ๆ คุณสามารถอ่านบทความทั้งหมด: คำแถลง Swift Guard
ห่อ
และในที่สุดการอ่านและการทดสอบฉันพบว่าถ้าคุณใช้ Guard เพื่อแกะตัวเลือกใด ๆ
ค่าที่ไม่ได้แยกเหล่านั้นจะอยู่รอบ ๆ เพื่อให้คุณใช้ในส่วนที่เหลือของบล็อกรหัสของคุณ
.
guard let unwrappedName = userName else {
return
}
print("Your username is \(unwrappedName)")
ที่นี่ค่า unrapped จะสามารถใช้ได้เฉพาะในถ้าบล็อก
if let unwrappedName = userName {
print("Your username is \(unwrappedName)")
} else {
return
}
// this won't work – unwrappedName doesn't exist here!
print("Your username is \(unwrappedName)")