Ist es möglich, den Bereichsoperator ...
und ..<
mit der if-Anweisung zu verwenden ? Maye so etwas:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
quelle
Ist es möglich, den Bereichsoperator ...
und ..<
mit der if-Anweisung zu verwenden ? Maye so etwas:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
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 ichxcrun 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:
quelle
Dies ist ein alter Thread, aber es scheint mir, dass wir das überdenken. Mir scheint, die beste Antwort ist gerecht
Da ist kein
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.
Bearbeiten:
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
quelle
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:
quelle
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/
quelle