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
,因此返回Bool
。 where
关键字指定附加要求,并且只能在switch
语句中使用。
因为这一切都泛滥了,vegetable
变量被赋值给 x (let x
)。
您可以阅读有关where
和switch
here 的更多信息。
【讨论】:
我已经阅读了苹果网站上的参考资料,但是有人如何访问切换蔬菜的结果?开关是功能吗?还是匹配案例中的代码只是运行? (对不起nooobie问题) 如果这样写会更有意义:vegatable.hasSuffix("pepper")【参考方案2】:在这种情况下实际上没有理由使用let x
。 case 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...)
James Munkres Topology: Theorem 19.6