답변:
"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-방출 어셈블리 main.swift
Swift 2부터는 다음과 같이 쓸 수 있습니다.
if case 200 ... 299 = statusCode {
print("success")
}
if 문에 새로 도입 된 패턴 일치를 사용합니다. "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
구문 을 지원하기를 바랍니다 . 그것은 훨씬 더 직관적이고 읽기 쉬운 sooooo입니다if 1...100 ~= x
if 200 ... 299 ~= statusCode
함수 호출없이 정확히 세 개의 어셈블리 명령어를 생성합니다. :)
if 200 ... 299 ~= statusCode
다음 과 동일한 어셈블리 코드를 제공합니다if statusCode >= 200 && statusCode <= 299
401을 제외한 4xx 오류를 확인하고 싶었습니다. 코드는 다음과 같습니다.
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
구현이 비효율적 인 것으로 나타났습니다 때까지 너무 범위 .contains () 연산자를 선호 - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
범위를 사용하여 조건 x <0을 나타낼 수 있습니다. (Int.min .. <0) .contains (x)는 정확히 같습니다. 그래도 속도가 훨씬 느립니다. contains (_ :)의 기본 구현은 전체 컬렉션을 순회하며 최악의 경우 9 배의 5 배 루프를 실행하는 것은 저렴하지 않습니다.