Antworten:
Sie können den Operator "Musterübereinstimmung" verwenden ~=
:
if 200 ... 299 ~= statusCode {
print("success")
}
Oder eine switch-Anweisung mit einem Ausdrucksmuster (das intern den Pattern-Match-Operator verwendet):
switch statusCode {
case 200 ... 299:
print("success")
default:
print("failure")
}
Beachten Sie, dass dies ..<
einen Bereich bezeichnet, in dem der obere Wert weggelassen wird, sodass Sie wahrscheinlich 200 ... 299
oder möchten
200 ..< 300
.
Zusätzliche Informationen: Wenn der obige Code in Xcode 6.3 mit aktivierten Optimierungen kompiliert wurde, dann für den Test
if 200 ... 299 ~= statusCode
eigentlich wird überhaupt kein Funktionsaufruf generiert, nur drei Montageanweisungen:
addq $-200, %rdi
cmpq $99, %rdi
ja LBB0_1
Dies ist genau der gleiche Assemblycode, für den generiert wurde
if statusCode >= 200 && statusCode <= 299
Sie können dies mit überprüfen
xcrun -sdk macosx swiftc -O -emit-Assembly main.swift
Ab Swift 2 kann dies wie folgt geschrieben werden
if case 200 ... 299 = statusCode {
print("success")
}
Verwenden des neu eingeführten Pattern-Matchings für if-Anweisungen. Siehe auch Swift 2 - Pattern Matching in "if" .
func ~= (Range<A>, A) -> Bool
aufgerufen wird. Ich würde annehmen, dass diese Funktion mit O (1) funktioniert.
xcrun -sdk macosx swift -emit-assembly main.swift
dem Assemblycode kompiliert und überprüft. Dann habe ich xcrun swift-demangle ...
den Namen der aufgerufenen Funktion entstellt. - Leider kann Xcode noch keinen Assembler-Code für Swift-Dateien erstellen. Möglicherweise funktioniert dies in einer späteren Version.
Diese Version scheint besser lesbar zu sein als der Mustervergleich:
if (200 ... 299).contains(statusCode) {
print("Success")
}
Dies ist ein alter Thread, aber es scheint mir, dass wir das überdenken. Mir scheint, die beste Antwort ist gerecht
if statusCode >= 200 && statusCode <= 299
Da ist kein
if 200 > statusCode > 299
Form, die mir bekannt ist, und die anderen vorgeschlagenen Lösungen führen Funktionsaufrufe aus, die schwerer zu lesen und möglicherweise langsamer auszuführen sind. Die Musterübereinstimmungsmethode ist ein nützlicher Trick, scheint jedoch für dieses Problem schlecht geeignet zu sein.
Persönlich finde ich den Pattern-Match-Operator abscheulich und wünschte, der Compiler würde die if x in 1...100
Syntax unterstützen. Das ist sooooo viel intuitiver und einfacher zu lesen alsif 1...100 ~= x
if 200 ... 299 ~= statusCode
, kein Funktionsaufruf :)
if 200 ... 299 ~= statusCode
if statusCode >= 200 && statusCode <= 299
Ich wollte 4xx Fehler außer 401 überprüfen. Hier ist der Code:
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
Ich habe auch den Operator Range .contains () bevorzugt, bis festgestellt wurde, dass seine Implementierung ineffizient ist - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
Wir können die Bedingung x <0 mit einem Bereich darstellen: (Int.min .. <0) .contains (x) ist genau äquivalent. Es ist jedoch viel langsamer. Die Standardimplementierung von enthält (_ :) durchläuft die gesamte Sammlung, und die Ausführung einer Schleife neun Billionen Mal im schlimmsten Fall ist nicht billig.