[if-statement] Swift에서 if와 함께 range 연산자를 사용할 수 있습니까?

범위 연산자 .....<with 문 을 사용할 수 있습니까? 이런 식으로 할 수 있습니다 :

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-방출 어셈블리 main.swift

Swift 2부터는 다음과 같이 쓸 수 있습니다.

if case 200 ... 299 = statusCode {
    print("success")
}

if 문에 새로 도입 된 패턴 일치를 사용합니다. “if”의 Swift 2-패턴 일치도 참조하십시오 .


답변

이 버전은 패턴 일치보다 읽기 쉽습니다.

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


답변

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 배 루프를 실행하는 것은 저렴하지 않습니다.


답변