首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于Swift中的线圈和开关

用于Swift中的线圈和开关
EN

Stack Overflow用户
提问于 2020-04-15 01:57:57
回答 3查看 454关注 0票数 0

我对编程(相对来说)比较陌生。我正在研究苹果公司的“应用程序开发简介”,因为没有这样的答案手册,所以我不得不自己解决问题。然而,有些事情我有点困惑:

我正在处理的一个问题是:

这个操场上有一种鸡的类型。一只鸡具有品种和回火的特性,这两种属性都是枚举。

这里有一组鸡:鸡={丝绸,脾气暴躁}.

任务是计算出有多少只鸡的品种“莱昂斯”和脾气“搞笑”有在数组中。我想出了以下代码:

代码语言:javascript
复制
var chickenOfInterestCount = 0

for chicken in chickens {
    switch chicken.temper {
    case .hilarious:
        switch chicken.breed {
        case .leghorn:
            chickenOfInterestCount += 1
        default:
            chickenOfInterestCount += 0
        }
    default:
        chickenOfInterestCount += 0
    }
}


chickenOfInterestCount

这是可行的,但我想知道是否有更有效的方法来做到这一点?我可以让开关检查每只鸡的{leghorn,搞笑},并直接计数所需的鸡数,而不是使用嵌套开关?(我自己尝试的所有尝试都被可怕的错误消息压碎了,所以我猜没有)接下来,循环是如何工作的?

当我最初学习for循环时,我的印象是整数被用来循环,例如,第一个循环是i= 0,里面的代码执行,然后第二个循环是i= 1,等等,其中"i“可以是任何东西,这个想法也是一样的。这里用的是“鸡”。为什么我可以将条件设置为chicken.temper?鸡肉在这里意味着什么?for循环是否尊重它正在循环的数组的类型?那么,这里到底发生了什么,比如“把第0只鸡放在一排鸡中,叫它‘鸡’,然后控制它的脾气”吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-15 03:17:53

我要说的第一件事是你的方法奏效了。正如你所怀疑的,这并不是最优雅的方法--但你已经本能地意识到了这一点。

Swift中的过滤器功能是强大和高效的,Dilan的例子将使您朝着正确的方向开始探索。但是,您将希望对控制流本身有一个很好的理解--除了地图、精简和过滤器等功能编程功能之外。

对于这种情况,如果你只需要一个品种和气质的组合,那么一个基本的if语句可能比使用开关更干净。

代码语言:javascript
复制
var chickenOfInterestCount = 0

for chicken in chickens {
    if chicken.breed == .leghorn && chicken.temper == .hilarious {
        chickenOfInterestCount += 1
    }
}

chickenOfInterestCount

当您必须为每一种情况做一些事情时,开关更有用--它最终比多个if / else语句干净得多。

代码语言:javascript
复制
var bantamCount = 0
var leghornCount = 0
var unknownBreedCount = 0

var chillCount = 0
var hilariousCount = 0
var unknownTemperCount = 0

for chicken in chickens {

    switch chicken.breed {
    case .bantam:
        bantamCount += 1
    case .leghorn:
        leghornCount += 1
    default:
        unknownBreedCount += 1
    }

    switch chicken.temper {
    case .chill:
        chillCount += 1
    case .hilarious:
        hilariousCount += 1
    default:
        unknownTemperCount += 1
    }

}

也是关于你的问题:

那么,这里到底发生了什么,比如“把第0只鸡放在一排鸡中,叫它‘鸡’,然后控制它的脾气”吗?

正如本所指出的,你对此的推理是正确的。在循环的范围内,有一个名为鸡肉的var,它是鸡肉的一个实例(大概--不确定您如何命名这个类或结构),并且是小鸡数组的一个成员。

票数 1
EN

Stack Overflow用户

发布于 2020-04-15 02:28:09

欢迎来到Programming.This是您的场景的模型。

代码语言:javascript
复制
  struct Chicken{
        let id:Int
        let breed:String
        let temper:String
    }
    
    enum Breed{
        static let leghorn = "leghorn"
        static let other = "other"
    }
    
    enum Temper{
        static let hilarious = "hilarious"
        static let other = "other"
    }
    
    
    var chickens:[Chicken] = []
    chickens.append(Chicken(id: 1, breed:.leghorn, temper:.hilarious))
    chickens.append(Chicken(id: 2, breed:.other, temper:.hilarious))
    chickens.append(Chicken(id: 3, breed:.leghorn, temper:.other))

您可以使用、Swift、、.Use Filter、function.This和$0表示当前element.It循环通过数组并找到满足条件的元素来获得结果。

代码语言:javascript
复制
print(chickens.filter({$0.breed == .leghorn && $0.temper == .hilarious}).count)

苹果文档

额外信息

票数 1
EN

Stack Overflow用户

发布于 2020-04-15 02:33:20

在这些情况下,要做的事情是释放map()、减()、compactMap()和filter() --在您的例子中,filter()

代码语言:javascript
复制
let chickens: [Chicken] = [ silkie, grumpy, dopey, foghorn ]

let hilariousLeghorns = chickens.filter { 
    $0.breed == .leghorn 
        && $0.temper == .hilarious 
}

let chickenOfInterestCount = hilariousLeghorns.count

(谢谢你使你的例子有趣!)

在您的伪代码中,for-循环有点嵌套,很难读懂。(我的可能并不容易--我很想看一看代码!)事实上,你是在宣布一只鸡,它将依次被分配给每一个鸡的元素的值。您可以使用任何序列,如数组、地图或集合来完成此操作。

要获得一个传统的for循环,您可以遍历一个范围:

代码语言:javascript
复制
for i in 1...5 { 
    print(i)
}

这做了同样的事情:我被分配值1、2、3、4和5,依次循环5次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61220091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档