Câu trả lời:
Bạn có thể sử dụng toán tử "khớp mẫu" ~=
:
if 200 ... 299 ~= statusCode {
print("success")
}
Hoặc câu lệnh chuyển đổi có mẫu biểu thức (sử dụng toán tử khớp mẫu bên trong):
switch statusCode {
case 200 ... 299:
print("success")
default:
print("failure")
}
Lưu ý rằng ..<
biểu thị một phạm vi bỏ qua giá trị trên, vì vậy bạn có thể muốn
200 ... 299
hoặc 200 ..< 300
.
Thông tin bổ sung: Khi mã trên được biên dịch trong Xcode 6.3 với bật tối ưu hóa, sau đó để kiểm tra
if 200 ... 299 ~= statusCode
thực tế không có lệnh gọi chức năng nào được tạo ra, chỉ có ba lệnh lắp ráp:
addq $-200, %rdi
cmpq $99, %rdi
ja LBB0_1
đây chính xác là mã lắp ráp được tạo ra cho
if statusCode >= 200 && statusCode <= 299
Bạn có thể xác minh rằng với
xcrun -sdk macosx swiftc -O -emit-lắp ráp main.swift
Kể từ Swift 2, điều này có thể được viết là
if case 200 ... 299 = statusCode {
print("success")
}
sử dụng khớp mẫu vừa được giới thiệu cho câu lệnh if. Xem thêm Swift 2 - Khớp mẫu trong "nếu" .
func ~= (Range<A>, A) -> Bool
được gọi. Tôi sẽ giả sử rằng hàm này hoạt động với O (1).
xcrun -sdk macosx swift -emit-assembly main.swift
và kiểm tra mã lắp ráp. Sau đó, tôi đã sử dụng xcrun swift-demangle ...
để khử tên của hàm được gọi. - Thật không may, Xcode chưa thể tạo mã lắp ráp cho các tệp Swift, có lẽ nó sẽ hoạt động trong phiên bản mới hơn.
Phiên bản này dường như dễ đọc hơn so với khớp mẫu:
if (200 ... 299).contains(statusCode) {
print("Success")
}
Đây là một chủ đề cũ, nhưng dường như tôi đang suy nghĩ quá mức về điều này. Dường như với tôi câu trả lời tốt nhất chỉ là
if statusCode >= 200 && statusCode <= 299
Không có
if 200 > statusCode > 299
hình thức mà tôi biết và các giải pháp được đề xuất khác đang thực hiện các cuộc gọi chức năng, khó đọc hơn và có thể thực thi chậm hơn. Phương pháp khớp mẫu là một mẹo hữu ích để biết, nhưng có vẻ như không phù hợp với vấn đề này.
Cá nhân, tôi thấy toán tử khớp mẫu là gớm ghiếc và mong muốn trình biên dịch sẽ hỗ trợ if x in 1...100
cú pháp. Điều đó thật trực quan và dễ đọc hơn nhiềuif 1...100 ~= x
if 200 ... 299 ~= statusCode
, không có chức năng gọi :)
if 200 ... 299 ~= statusCode
cung cấp cho các cùng mã lắp ráp nhưif statusCode >= 200 && statusCode <= 299
Tôi muốn kiểm tra lỗi 4xx ngoại trừ 401. Đây là mã:
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
Tôi cũng thích toán tử Range .contains (), cho đến khi thấy rằng việc triển khai của nó không hiệu quả - https://oleb.net/blog/2015/09/swift-ranges-and-inter đạn /
Chúng ta có thể biểu diễn điều kiện x <0 bằng một phạm vi: (Int.min .. <0) .contains (x) hoàn toàn tương đương. Nó là rất chậm, mặc dù. Việc triển khai mặc định chứa (_ :) đi qua toàn bộ bộ sưu tập và thực hiện một vòng lặp chín triệu triệu lần trong trường hợp xấu nhất không phải là rẻ.