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