เป็นไปได้หรือไม่ที่จะใช้โอเปอเรเตอร์ช่วง...
และ..<
ด้วยคำสั่ง if Maye บางสิ่งเช่นนี้:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
เป็นไปได้หรือไม่ที่จะใช้โอเปอเรเตอร์ช่วง...
และ..<
ด้วยคำสั่ง if Maye บางสิ่งเช่นนี้:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
คำตอบ:
คุณสามารถใช้โอเปอเรเตอร์ "pattern-match" ~=
:
if 200 ... 299 ~= statusCode {
print("success")
}
หรือข้อความสั่งสวิตช์ที่มีรูปแบบนิพจน์ (ซึ่งใช้ตัวดำเนินการจับคู่รูปแบบภายใน):
switch statusCode {
case 200 ... 299:
print("success")
default:
print("failure")
}
โปรดทราบว่า..<
หมายถึงช่วงที่ละเว้นค่าบนดังนั้นคุณอาจต้องการ
หรือ200 ... 299
200 ..< 300
ข้อมูลเพิ่มเติม:เมื่อโค้ดข้างต้นได้รับการรวบรวมใน Xcode 6.3 พร้อมกับเปิดการปรับให้เหมาะสมเพื่อทำการทดสอบ
if 200 ... 299 ~= statusCode
อันที่จริงไม่มีการเรียกใช้ฟังก์ชั่นใด ๆ เลยมีเพียงสามชุดคำสั่ง:
addq $-200, %rdi
cmpq $99, %rdi
ja LBB0_1
นี่เป็นรหัสแอสเซมบลีเดียวกับที่สร้างขึ้นทั้งหมด
if statusCode >= 200 && statusCode <= 299
คุณสามารถยืนยันด้วย
xcrun -sdk macosx swiftc -O -emit-assembly main.swift
ตั้งแต่ Swift 2สามารถเขียนได้ดังนี้
if case 200 ... 299 = statusCode {
print("success")
}
ใช้การจับคู่รูปแบบที่เพิ่งแนะนำสำหรับคำสั่ง if ดูเพิ่มเติมSwift 2 - รูปแบบการจับคู่ใน "ถ้า"
func ~= (Range<A>, A) -> Bool
เรียกว่า ฉันคิดว่าฟังก์ชั่นนี้ใช้งานได้กับ O (1)
xcrun -sdk macosx swift -emit-assembly main.swift
และตรวจสอบรหัสประกอบ จากนั้นฉันก็xcrun swift-demangle ...
จะยกเลิกการย่อชื่อของฟังก์ชันที่เรียกว่า - น่าเสียดายที่ Xcode ยังไม่สามารถสร้างรหัสการประกอบสำหรับไฟล์ Swift ได้บางทีมันอาจจะทำงานในรุ่นที่ใหม่กว่า
ดูเหมือนว่ารุ่นนี้จะสามารถอ่านได้มากกว่าการจับคู่รูปแบบ:
if (200 ... 299).contains(statusCode) {
print("Success")
}
นี่เป็นหัวข้อเก่า แต่ดูเหมือนว่าสำหรับฉันเราคิดมากเกินไป ดูเหมือนว่าคำตอบที่ดีที่สุดสำหรับฉันก็คือ
if statusCode >= 200 && statusCode <= 299
ไม่มี
if 200 > statusCode > 299
แบบฟอร์มที่ฉันทราบและแนวทางแก้ไขปัญหาอื่น ๆ ที่แนะนำกำลังทำการเรียกใช้ฟังก์ชันซึ่งยากต่อการอ่านและอาจช้ากว่าในการเรียกใช้งาน วิธีการจับคู่รูปแบบเป็นเคล็ดลับที่มีประโยชน์ที่จะรู้ แต่ดูเหมือนจะไม่พอดีสำหรับปัญหานี้
โดยส่วนตัวแล้วฉันพบว่าโอเปอเรเตอร์การจับคู่รูปแบบน่าเกลียดและหวังว่าคอมไพเลอร์จะรองรับif x in 1...100
ไวยากรณ์ นั่นเป็นเรื่องที่อ่านได้ง่ายกว่าและง่ายกว่ามากif 1...100 ~= x
if 200 ... 299 ~= statusCode
โดยไม่มีการเรียกใช้ฟังก์ชั่น :)
if 200 ... 299 ~= statusCode
ให้รหัสแอสเซมบลีที่เหมือนกันจริง ๆif statusCode >= 200 && statusCode <= 299
ฉันต้องการตรวจสอบข้อผิดพลาด 4xx ยกเว้น 401 นี่คือรหัส:
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
ฉันต้องการตัวดำเนินการ Range .contain () เช่นกันจนกระทั่งพบว่าการใช้งานไม่มีประสิทธิภาพ - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
เราสามารถแสดงเงื่อนไข x <0 โดยใช้ช่วง: (Int.min .. <0) .contain (x) เทียบเท่ากัน มันช้ากว่าอย่างมาก การเริ่มต้นการใช้งานของ contain (_ :) สำรวจการเก็บรวบรวมทั้งหมดและการดำเนินการวนซ้ำเก้าล้านครั้งในกรณีที่เลวร้ายที่สุดนั้นไม่ถูก