If statement 我可以在Swift中使用带if语句的范围运算符吗?

If statement 我可以在Swift中使用带if语句的范围运算符吗?,if-statement,swift,range,If Statement,Swift,Range,是否可以使用范围运算符…和。您可以使用“模式匹配”运算符~=: if 200 ... 299 ~= statusCode { print("success") } 或具有表达式模式(使用模式匹配)的switch语句 操作员(内部): 请注意,。这是一个旧线程,但在我看来,我们似乎考虑过了。在我看来,最好的答案是 if statusCode >= 200 && statusCode <= 299 我所知道的表单,以及其他建议的解决方案都是进行函数调用,这些函

是否可以使用范围运算符
。您可以使用“模式匹配”运算符
~=

if 200 ... 299 ~= statusCode {
    print("success")
}
或具有表达式模式(使用模式匹配)的switch语句 操作员(内部):


请注意,
。这是一个旧线程,但在我看来,我们似乎考虑过了。在我看来,最好的答案是

if statusCode >= 200 && statusCode <= 299
我所知道的表单,以及其他建议的解决方案都是进行函数调用,这些函数调用更难阅读,执行起来可能更慢。模式匹配方法是一个有用的技巧,但似乎不适合这个问题

编辑:
就我个人而言,我发现模式匹配操作符非常糟糕,希望编译器能够支持
if x in 1…100
语法。如果1…100 ~=x
这个版本似乎比模式匹配更具可读性:

if (200 ... 299).contains(statusCode) {
    print("Success")
}

我也喜欢Range.contains()运算符,直到发现它的实现效率低下-

我们可以使用一个范围来表示条件x<0:
(Int.min..我想检查除401之外的4xx错误。以下是代码:

let i = 401

if 400..<500 ~= i, i != 401 {
    print("yes")
} else {
    print("NO")
}
设i=401

如果您想知道响应状态代码是否成功,只需这样做即可

  if response.statuscode < 300 {
      print("response is a success")
  }
如果response.statuscode<300{
打印(“回复成功”)
}

如果您从200201203204…300开始迭代。只是有太多不必要的迭代。希望这有帮助!:D

很酷,这是O(1)吗?另外,如果Swift有一个switch语句的简写本就好了,比如Scala。但是考虑到您总是被迫在Swift编译时处理所有的可能性,这可能不是真的可行。@Sky:从生成的汇编代码中可以看到库函数
func~=(范围,a)->Bool
被调用。我假设此函数与O(1)一起工作@Downvoter:一些解释性的评论会很好,这样我可以改进或修正答案…@MartinR你如何知道汇编语言调用了哪个函数。Hopper?+1很酷answer@codester:我使用
xcrun-sdk macosx swift-emit assembly main.swift编译了命令行上的代码,并检查了程序集代码。然后我使用了
xcrun swift-demangle…
来删除被调用函数的名称。-不幸的是,Xcode还不能为swift文件创建汇编代码,也许它可以在更高版本中使用。您是对的,这个版本更易于阅读,我只是试图回答一个明确的问题“是否可以使用范围运算符…”–但是Xcode 6.3 beta(在优化模式下)为
if 200…299~=statusCode
生成了三条汇编指令,没有函数调用:)实际上
if 200。。。299~=statusCode
如果statusCode>=200&&statusCode,则提供与
相同的汇编代码,除非此条件位于每秒访问数千次的关键部分,否则担心函数调用开销是过早优化。即使这样,我也更担心函数调用在做什么,而不是调用它的成本。“干得好,@MartinR证明了不计成本。”rickster,没错。作为习惯问题,我仍然倾向于选择高效的结构而不是低效的结构(假设可读性相似)。不是说我在这上面浪费了太多时间,但知道不同方法的成本是值得的。这是吹毛求疵,但我不同意你的建议,即你的if声明比@SerhiiYakovenko发布的答案更可读或更易懂。只需在DRY的基础上,您就可以将“statusCode”命名两次。在一次深夜睡眼惺忪的调试会话中,我决定在这里使用另一个名为“statusValue”的变量,而不是“statusCode”,我可能会犯更改其中一个变量名而不是另一个变量名的错误。正是我所搜索的,我得到了这个错误=>无法用上界if statusCode >= 200 && statusCode <= 299
xcrun -sdk macosx swiftc -O -emit-assembly main.swift
if case 200 ... 299 = statusCode {
    print("success")
}
if statusCode >= 200 && statusCode <= 299
if 200 > statusCode > 299
if (200 ... 299).contains(statusCode) {
    print("Success")
}
let i = 401

if 400..<500 ~= i, i != 401 {
    print("yes")
} else {
    print("NO")
}
  if response.statuscode < 300 {
      print("response is a success")
  }