我对编程(相对来说)比较陌生。我正在研究苹果公司的“应用程序开发简介”,因为没有这样的答案手册,所以我不得不自己解决问题。然而,有些事情我有点困惑:
我正在处理的一个问题是:
这个操场上有一种鸡的类型。一只鸡具有品种和回火的特性,这两种属性都是枚举。
这里有一组鸡:鸡={丝绸,脾气暴躁}.
任务是计算出有多少只鸡的品种“莱昂斯”和脾气“搞笑”有在数组中。我想出了以下代码:
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只鸡放在一排鸡中,叫它‘鸡’,然后控制它的脾气”吗?
发布于 2020-04-15 03:17:53
我要说的第一件事是你的方法奏效了。正如你所怀疑的,这并不是最优雅的方法--但你已经本能地意识到了这一点。
Swift中的过滤器功能是强大和高效的,Dilan的例子将使您朝着正确的方向开始探索。但是,您将希望对控制流本身有一个很好的理解--除了地图、精简和过滤器等功能编程功能之外。
对于这种情况,如果你只需要一个品种和气质的组合,那么一个基本的if语句可能比使用开关更干净。
var chickenOfInterestCount = 0
for chicken in chickens {
if chicken.breed == .leghorn && chicken.temper == .hilarious {
chickenOfInterestCount += 1
}
}
chickenOfInterestCount当您必须为每一种情况做一些事情时,开关更有用--它最终比多个if / else语句干净得多。
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,它是鸡肉的一个实例(大概--不确定您如何命名这个类或结构),并且是小鸡数组的一个成员。
发布于 2020-04-15 02:28:09
欢迎来到Programming.This是您的场景的模型。
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循环通过数组并找到满足条件的元素来获得结果。
print(chickens.filter({$0.breed == .leghorn && $0.temper == .hilarious}).count)发布于 2020-04-15 02:33:20
在这些情况下,要做的事情是释放map()、减()、compactMap()和filter() --在您的例子中,filter()
let chickens: [Chicken] = [ silkie, grumpy, dopey, foghorn ]
let hilariousLeghorns = chickens.filter {
$0.breed == .leghorn
&& $0.temper == .hilarious
}
let chickenOfInterestCount = hilariousLeghorns.count(谢谢你使你的例子有趣!)
在您的伪代码中,for-循环有点嵌套,很难读懂。(我的可能并不容易--我很想看一看代码!)事实上,你是在宣布一只鸡,它将依次被分配给每一个鸡的元素的值。您可以使用任何序列,如数组、地图或集合来完成此操作。
要获得一个传统的for循环,您可以遍历一个范围:
for i in 1...5 {
print(i)
}这做了同样的事情:我被分配值1、2、3、4和5,依次循环5次。
https://stackoverflow.com/questions/61220091
复制相似问题