อะไรคือความแตกต่างระหว่างprecondition(condition: Bool, message: String)
และassert(condition: Bool, message: String)
ในสวิฟท์?
ทั้งสองคนดูเหมือนกันกับฉัน เราควรใช้บริบทใด
อะไรคือความแตกต่างระหว่างprecondition(condition: Bool, message: String)
และassert(condition: Bool, message: String)
ในสวิฟท์?
ทั้งสองคนดูเหมือนกันกับฉัน เราควรใช้บริบทใด
คำตอบ:
assert
มีไว้สำหรับการตรวจสอบความมีสติสัมปชัญญะในระหว่างการทดสอบในขณะที่precondition
เพื่อป้องกันสิ่งต่างๆที่หากเกิดขึ้นจะหมายความว่าโปรแกรมของคุณไม่สามารถดำเนินการได้อย่างสมเหตุสมผล
ตัวอย่างเช่นคุณอาจทำการassert
คำนวณบางอย่างที่มีผลลัพธ์ที่สมเหตุสมผล (ภายในขอบเขตบางอย่างเช่น) เพื่อค้นหาอย่างรวดเร็วว่าคุณมีข้อบกพร่องหรือไม่ แต่คุณไม่ต้องการจัดส่งด้วยเนื่องจากผลลัพธ์นอกขอบเขตอาจถูกต้องและไม่สำคัญจึงไม่ควรทำให้แอปของคุณขัดข้อง (สมมติว่าคุณใช้เพียงเพื่อแสดงความคืบหน้าในแถบความคืบหน้า)
ในทางกลับกันการตรวจสอบว่าตัวห้อยบนอาร์เรย์นั้นถูกต้องเมื่อดึงองค์ประกอบเป็นไฟล์precondition
. ไม่มีการดำเนินการถัดไปที่สมเหตุสมผลสำหรับอ็อบเจ็กต์อาร์เรย์ที่จะดำเนินการเมื่อถูกขอตัวห้อยที่ไม่ถูกต้องเนื่องจากต้องส่งคืนค่าที่ไม่เป็นทางเลือก
ข้อความเต็มจากเอกสาร (ลองคลิกตัวเลือกassert
และprecondition
ใน Xcode):
เงื่อนไขเบื้องต้น
ตรวจสอบเงื่อนไขที่จำเป็นสำหรับการก้าวไปข้างหน้า
ใช้ฟังก์ชั่นนี้เพื่อตรวจจับเงื่อนไขที่ทำให้โปรแกรมไม่สามารถดำเนินการได้แม้จะอยู่ในรหัสการจัดส่งก็ตาม
ในสนามเด็กเล่นและสร้าง -Onone (ค่าเริ่มต้นสำหรับการตั้งค่าการดีบัก Xcode ของ): ถ้าประเมินเท็จหยุดการทำงานของโปรแกรมในรัฐแก้ปัญหาได้หลังจากการพิมพ์
condition
message
In -O builds (ค่าเริ่มต้นสำหรับ Xcode's Release configuration): หาก
condition
ประเมินเป็นเท็จให้หยุดการทำงานของโปรแกรมใน -Ounchecked สร้าง
condition
ไม่ได้รับการประเมิน แต่เพิ่มประสิทธิภาพอาจจะคิดว่ามันจะtrue
ประเมิน การไม่ปฏิบัติตามสมมติฐานใน -Ounchecked builds เป็นข้อผิดพลาดในการเขียนโปรแกรมที่ร้ายแรง
ยืนยัน
ยืนยันสไตล์ C แบบดั้งเดิมด้วยข้อความเสริม
ใช้ฟังก์ชันนี้สำหรับการตรวจสอบความเรียบร้อยภายในที่ทำงานอยู่ในระหว่างการทดสอบ แต่ไม่ส่งผลกระทบต่อประสิทธิภาพของรหัสการขนส่ง เพื่อตรวจสอบการใช้งานที่ไม่ถูกต้องในรุ่น Release; ดู
precondition
.
ในสนามเด็กเล่นและสร้าง -Onone (ค่าเริ่มต้นสำหรับการตั้งค่าการดีบัก Xcode ของ): ถ้าประเมินเท็จหยุดการทำงานของโปรแกรมในรัฐแก้ปัญหาได้หลังจากการพิมพ์
condition
message
In -O builds (ค่าเริ่มต้นสำหรับการกำหนดค่ารีลีสของ Xcode)
condition
ไม่ได้รับการประเมินและไม่มีเอฟเฟกต์ใน -Ounchecked สร้าง
condition
ไม่ได้รับการประเมิน แต่เพิ่มประสิทธิภาพอาจจะคิดว่ามันจะtrue
ประเมิน การไม่ปฏิบัติตามสมมติฐานใน -Ounchecked builds เป็นข้อผิดพลาดในการเขียนโปรแกรมที่ร้ายแรง
data["name"]
ไม่มีอยู่จริง แต่ควร การมีเจ้าหน้าที่รักษาการณ์อยู่ข้างใน .. else {} จะช่วยให้ฉันจับข้อผิดพลาดของฉันได้โดยการขัดข้องและนำฉันไปสู่ปัญหา ในทำนองเดียวกันถ้ารหัสนี้อยู่ระหว่างการผลิตผู้ยืนยันจะไม่ขัดข้องกับโปรแกรมและรหัสสำรองใด ๆ ที่ฉันใช้ ( return nil
) จะเข้ายึดครอง
ฉันพบว่าSwift ยืนยัน - คู่มือที่ขาดหายไปจะเป็นประโยชน์
debug release release
function -Onone -O -Ounchecked
assert() YES NO NO
assertionFailure() YES NO NO**
precondition() YES YES NO
preconditionFailure() YES YES YES**
fatalError()* YES YES YES
และจากการอภิปรายที่น่าสนใจเกี่ยวกับ Swift Evolution
- ยืนยัน: ตรวจสอบรหัสของคุณเองเพื่อหาข้อผิดพลาดภายใน
- เงื่อนไขเบื้องต้น: สำหรับการตรวจสอบว่าลูกค้าของคุณให้ข้อโต้แย้งที่ถูกต้องแก่คุณ
นอกจากนี้คุณต้องระมัดระวังเกี่ยวกับสิ่งที่จะใช้ดูassertionFailure และ Optimization Level
precondition()
และpreconditionFailure()
จะมีพฤติกรรมเดียวกัน ความแตกต่างระหว่างฟังก์ชันเหล่านี้คือ: precondition
ต้องมีเงื่อนไขภายในในขณะที่preconditionFailure
เพียงแค่โยนออกไป
แอปprecondition
นี้ทำงานอยู่ในโหมดเผยแพร่ดังนั้นเมื่อคุณจัดส่งแอปและเงื่อนไขเบื้องต้นล้มเหลวแอปจะยุติลง
Assert
ทำงานในโหมดดีบักเป็นค่าเริ่มต้น
ฉันพบคำอธิบายที่ดีนี้เมื่อจะใช้กับ NSHipster:
การยืนยันเป็นแนวคิดที่ยืมมาจากตรรกะคลาสสิก ในทางตรรกะการยืนยันคือข้อความเกี่ยวกับข้อเสนอภายในการพิสูจน์ ในการเขียนโปรแกรมการยืนยันแสดงถึงสมมติฐานที่โปรแกรมเมอร์ทำเกี่ยวกับแอปพลิเคชัน ณ สถานที่ที่มีการประกาศ
เมื่อใช้ในความสามารถของเงื่อนไขเบื้องต้นและเงื่อนไขภายหลังซึ่งอธิบายถึงความคาดหวังเกี่ยวกับสถานะของรหัสในตอนเริ่มต้นและจุดสิ้นสุดของการดำเนินการของวิธีการหรือฟังก์ชันการยืนยันจะเป็นสัญญา นอกจากนี้ยังสามารถใช้การยืนยันเพื่อบังคับใช้เงื่อนไขในขณะรันไทม์เพื่อป้องกันการดำเนินการเมื่อเงื่อนไขเบื้องต้นบางอย่างล้มเหลว
เงื่อนไขเบื้องต้น
func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
ตรวจสอบเงื่อนไขที่จำเป็นสำหรับการก้าวไปข้างหน้า
ยืนยัน
func assert(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
ยืนยันสไตล์ C แบบดั้งเดิมด้วยข้อความเสริม
ใช้ฟังก์ชันนี้สำหรับการตรวจสอบความเรียบร้อยภายในที่ทำงานอยู่ระหว่างการทดสอบ แต่ไม่มีผลกระทบต่อประสิทธิภาพของรหัสการขนส่ง เพื่อตรวจสอบการใช้งานที่ไม่ถูกต้องในรุ่น Release; ดูเงื่อนไขเบื้องต้น
ใน Playgrounds และ -Onone builds (ค่าดีฟอลต์สำหรับคอนฟิกูเรชันดีบักของ Xcode): หากเงื่อนไขประเมินว่าเป็นเท็จให้หยุดการทำงานของโปรแกรมในสถานะที่ดีบักได้หลังจากพิมพ์ข้อความ
แค่อยากจะเพิ่ม 2 เซ็นต์ของฉัน คุณสามารถเพิ่มการยืนยันในรหัสของคุณได้มากเท่าที่คุณต้องการ คุณสามารถจัดส่งรหัสของคุณด้วยการยืนยันเหล่านี้ Swift ไม่ได้ประเมินบล็อคโค้ดเหล่านี้สำหรับแอพที่ใช้งานจริง สิ่งเหล่านี้จะได้รับการประเมินในกรณีของโหมดดีบักเท่านั้น
แนบรูปภาพจาก swift.org ด้วย
โปรดทราบว่านี่ไม่ใช่กรณีที่มีเงื่อนไขเบื้องต้น รหัสที่มาพร้อมเงื่อนไขเบื้องต้นจะหยุดทำงานและแอปจะยุติหากเงื่อนไขเบื้องต้นไม่ได้รับการประเมินว่าเป็นจริง
ดังนั้นในระยะสั้นการยืนยันมีไว้สำหรับการแก้ไขข้อบกพร่อง แต่สามารถจัดส่งได้โดยไม่ส่งผลกระทบต่อการผลิต การยืนยันจะได้รับการประเมินในโหมดดีบัก แต่ไม่ได้อยู่ในการใช้งานจริง
และ
เงื่อนไขเบื้องต้นมีไว้เพื่อให้แน่ใจว่าสิ่งที่ไม่คาดคิดจะไม่เกิดขึ้นในสภาพแวดล้อมการผลิต เงื่อนไขเหล่านั้นได้รับการประเมินและจะยุติแอปของคุณในกรณีที่ประเมินว่าเป็นเท็จ