Swift for case let和for循环有何不同+;如果让我?

Swift for case let和for循环有何不同+;如果让我?,swift,Swift,我刚刚了解了for case let,这两个版本的循环具有相同的输出。这让我想知道,case-let和带有if-then语句的普通for循环(在性能或其他方面)有什么区别吗 我开始考虑这一点,因为我听说我不应该处理开关的情况下,如果然后是相同的,可以完成非常不同的事情 class Daddy { } class Son: Daddy { func speak() { print("I am son!") } } var people =

我刚刚了解了for case let,这两个版本的循环具有相同的输出。这让我想知道,case-let和带有if-then语句的普通for循环(在性能或其他方面)有什么区别吗

我开始考虑这一点,因为我听说我不应该处理开关的情况下,如果然后是相同的,可以完成非常不同的事情

class Daddy {

}

class Son: Daddy {
    func speak() {
        print("I am son!")
    }
}

var people = [Son(), Daddy()]

for case let person as Son in people {
    person.speak()
}

for person in people {
    if let son = person as? Son {
        son.speak()
    }
}

正如其他人所评论的,代码的性能不是问题所在。相反,人们关心的是为决策建立一个心理框架

i、 作为程序员,你如何减少大脑将决策输入代码所需的时间?你不能让自己每次都自由地做出不同的决定,否则你自己的表现就会受到影响

你所做的任何选择都是可以接受的,但没有决策框架是不行的


我推荐的一个助记方法是思维模式,“我将利用封装样板文件的语言特性,而不是允许自己将样板文件放入源代码中”。这将给您留下:

为案例,让儿子成为人的儿子{
儿子说
}
for case let
语法是一种基于选项过滤序列的方法

鉴于此:

var-daddies:[Daddy?]=[Son(),Daddy()]
在这里,daddy的类型是
daddy?

for daddy in daddies {
…但在这里,它被展开为
爸爸

for case let daddy? in daddies {
而这个

适用于人与人之间的人{
如果让儿子=作为儿子的人{
儿子说
}
}
…只是这方面的语法糖:

适用于人与人之间的人{
如果案例让儿子?=作为儿子的人{
儿子说
}
}
演示将if语句提升到for循环(这是它的正确作用域)的中间步骤将不会编译

<代码>为case let son?作为?人子{
…因此,你必须直接跳到

为案例,让儿子成为人的儿子{

与switch语句使用的语法相同,switch语句也不允许条件转换。

与许多与性能相关的问题一样,答案通常是相同的:(a)这并不重要,除非您谈论的是数千或数十万个元素;因此在正常情况下,优化代码清晰度,以及(b)如果你确实遇到了性能危急的情况,那么用所有的编译器优化来衡量每一个案例,我会说问题是基于观点的。我的观点是,
for case let
是一个鲜为人知的习惯用法。因此,它比
for…if let
更酷,尽管有点晦涩,但事实上大多数Swift程序员可能会编写后者。至于性能,嘿,case let的
必须像
for…in
一样循环整个序列,所以可能性有多大?使用您认为最清晰和表达力最强的语法,除了最极端的情况外,不要担心性能。一旦开始使用
for case let…{…}
语法(或
for…where…{…}
语法,就这一点而言),我怀疑您可能会找到嵌套的
for…{if…{…}
语法看起来很麻烦,但这里很清楚,这是一个意见问题,因此堆栈溢出是离题的。对于case let…
for case let…
)(以及对于where…
)语法确实有一个微小而微妙的优势,因为它有时可以使人们更容易一眼就对代码进行推理。。。{{{}}},你必须在你的代码中进一步扫描,以确保没有一个挥之不去的<代码>其他< /代码>子句,这是你必须考虑的。在<代码>中,这是不必要的,以便让语法。显然,在你的琐碎例子中,这不是问题,但是如果它更复杂,那就需要考虑。(这与早期退出代码更容易推理的原因类似,早期退出代码带有
guard let