let x where x.hasSuffix("pepper") 如何工作

Posted

技术标签:

【中文标题】let x where x.hasSuffix("pepper") 如何工作【英文标题】:How does let x where x.hasSuffix("pepper") work 【发布时间】:2014-06-02 22:23:42 【问题描述】:

在下面的代码块中,我无法理解let x where x.hasSuffix("pepper")

let vegetable = "red pepper"

switch vegetable 
    case "celery":
        let vegetableComment = "Add some raisins and make ants on a log."
    case "cucumber", "watercress":
        let vegetableComment = "That would make a good tea sandwhich"
    case let x where x.hasSuffix("pepper"):
        let vegetableComment = "Is it a spicy \(x)"
    default:
        let vegetableComment = "Everything tastes good in soup."

控制台输出

vegetableComment:是不是很辣的红辣椒

似乎发生了以下逻辑。

x = vegetable
if (x's suffix == 'pepper') 
    run case

谁能更好地解释一下?

【问题讨论】:

看起来像一个内联 lambda 【参考方案1】:

vegetable 是一个隐含的String。和你写的一样:

var vegetable: String = "red pepper"

hasSuffix 被声明为func hasSuffix(suffix: String) -> Bool,因此返回Boolwhere 关键字指定附加要求,并且只能在switch 语句中使用。 因为这一切都泛滥了,vegetable 变量被赋值给 x (let x)。

您可以阅读有关whereswitch here 的更多信息。

【讨论】:

我已经阅读了苹果网站上的参考资料,但是有人如何访问切换蔬菜的结果?开关是功能吗?还是匹配案例中的代码只是运行? (对不起nooobie问题) 如果这样写会更有意义:vegatable.hasSuffix("pepper")【参考方案2】:

在这种情况下实际上没有理由使用let xcase let x where x.hasSuffix("pepper"): 可以简单地替换为 case vegetable where vegetable.hasSuffix("pepper")。在这种情况下,声明了一个额外的变量x,它复制了vegetable。这是没有用的,并且有争议会降低可读性,即使您也将 x 重命名为 vegetable

在 switch 语句 case 中使用 let 在其他情况下很有用,例如当“参数”(蔬菜)不是变量时,例如switch(getVegetableName()) ,或者在“参数”是一个元组的情况下,需要解包,例如在

let vegetableNameAndCountry = ("Sweet Potato", "United States")

switch(vegetableNameAndCountry) 
   case (let vegetable, let country) where country == "Tanzania":
       print("This \(vegetable) comes from a country north of Kenya")
   case ("Sweet Potato", _): // Note here I ignore the country, and don't even bother creating a constant for it
       print("Sweet sweet potatoes")
   default:
       print("We don't care about this vegetable")

【讨论】:

以上是关于let x where x.hasSuffix("pepper") 如何工作的主要内容,如果未能解决你的问题,请参考以下文章

Linq to Entities基础之需要熟知14个linq关键字(from,where,select,group,let,on,by...)

在 Swift 中使用 if let 赋值

James Munkres Topology: Theorem 19.6

XQuery FLWOR 表达式

Fuzzy Probability Theory---Discrete Random Variables

let in