案例如何适用于案件

old*_*der 12 swift

一位老C程序员可以使用Swift的一些帮助.

我不了解if-case语法.例如:

if case 20...30 = age {
   print ("in range.")
}
Run Code Online (Sandbox Code Playgroud)

case 20...30 = age似乎是在条件测试if语句.所以我最初很困惑,看到使用了赋值运算符('=')而不是比较运算符('==').

好吧,我心想,这可能意味着该case语句实际上是一个返回布尔值的函数调用.然后,返回的值将满足if语句中的比较测试.

作为一个实验,我尝试将case语句视为常规条件测试,并在其周围放置括号.斯威夫特很乐意接受if (x == 5)if (true).但是会if (case 20...30 = age)产生错误.因此case声明似乎不像函数那样.

我很想知道这里发生了什么.任何见解将不胜感激.

mat*_*att 21

操作员是if case,所以你不能放括号.语法和行为基于caseSwift switch语句中的语句(如果需要详细信息,请参阅我的在线书籍).在case语句中,20...30是一个区间,用作模式,通过使用contains区间来操作.等号确实令人困惑,但这是他们首次尝试使用语法来表达case语句应该与之比较的内容(即语句中关键字后面的标记).switchswitch

所以,如果你明白这一点:

switch age {
case 20...30:
    // do stuff
default:break
}
Run Code Online (Sandbox Code Playgroud)

...然后你就会明白它是如何直接变成这样的:

if case 20...30 = age {
   // do stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 这很有帮助,谢谢.我可以看到`if case'是如何从`switch case`演变而来的,但我很高兴知道其他人也发现在语法中使用等号是令人困惑的. (4认同)
  • 我相信语法会在未来发生变化。 (2认同)

Ale*_*ica 6

@matt很好地解释了代码的作用.我在这里建议一个更好的选择.

您可以使用~=运算符来检查范围.它是一个常规的操作符/函数,只返回一个Bool,没有特殊的语言魔法.

if 20...30 ~= age {
   print ("in range.")
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我们想要更清晰的替代方案,我还建议`if(20 ... 30).contains(age){...}`看到模式匹配运算符的标题实际上并没有确切地说它是什么确实. (6认同)
  • 1)`if case`语法令人困惑(否则这个问题不存在).2)`〜=`是一个常规函数,任何不知道它的人都可以命令点击它并查看实现,就像它们的任何其他外来函数一样. (2认同)