gpt4 book ai didi

swift - 将默认参数值发送给函数?

转载 作者:搜寻专家 更新时间:2023-11-01 05:35:53 25 4
gpt4 key购买 nike

长话短说

如果我有 func show(message: String = "Hello"),我如何向它发送默认参数而不省略参数名称? (例如 show(message: default))

注意:show() 不是我要找的!详情请见下文。


假设我们定义了以下函数:

func makeCreature(color: UIColor, eyeCount: Int = 2, noseCount: Int = 1) -> Creature {
// ...
}

然后我们还定义了另一个方法,makeCreatures:

func makeCreatures(count: Int, color: UIColor) {
for 1...count {
makeCreature(color: color)
}
}

但是,现在我们想要轻松地为 makeCreatures 自定义 eyeCount 和 noseCount。一种方法是重新定义参数及其默认值:

解决方案#1

func makeCreatures(count: Int, color: UIColor, eyeCount: Int = 2, noseCount: Int = 1) {
for 1...count {
makeCreature(color: color, eyeCount: eyeCount, noseCount: noseCount)
}
}

问题是如果眼睛的默认数量发生变化,我需要记住在 2 个地方更新它:makeCreaturemakeCreatures

我希望做的是将方法定义为:

func makeCreatures(count: Int, color: UIColor, eyeCount: Int? = nil, noseCount: Int? = nil)

但是,这意味着我必须创建 4 个不同的 if 分支:

解决方案#2

func makeCreatures(count: Int, color: UIColor, eyeCount: Int? = nil, noseCount: Int? = nil) {
for 1...count {
if let eyeCount = eyeCount, let noseCount = noseCount {
makeCreature(color: color, eyeCount: eyeCount, noseCount: noseCount)
} else if let eyeCount = eyeCount {
makeCreature(color: color, eyeCount: eyeCount)
} else if let noseCount = noseCount {
makeCreature(color: color, noseCount: noseCount)
} else {
makeCreature(color: color)
}
}
}

必须创建 4 个不同的分支有点丑陋且难以理解。有没有更好的方法可以让我的解决方案#1 简洁,同时又能提供#2 的干爽性?类似这样的东西:

理想的解决方案?

func makeCreatures(count: Int, color: UIColor, eyeCount: Int? = nil, noseCount: Int? = nil) {
for 1...count {
makeCreature(color: color,
eyeCount: eyeCount ?? default,
noseCount: noseCount ?? default)
}
}

default 表示使用 makeCreature 中定义的默认参数值(即 2 用于 eyeCount1 代表 noseCount)。

如果不能,还有哪些其他解决方案可以帮助我实现这一目标?

最佳答案

为了完整起见,还有另一个类似于 Alexander's 的解决方案.

您可以创建一个结构来保留生物的属性:

struct Attributes {
let color: UIColor
let eyeCount: Int = 2
let noseCount: Int = 1
}

然后重新定义接受属性的函数:

func makeCreature(attributes: Attributes) -> Creature {
// ...
}

func makeCreatures(count: Int, attributes: Attributes) {
for 1...count {
makeCreature(color: color, attributes: attributes)
}
}

这允许您对两个函数使用默认值:

// uses 2 eyes (default), and 2 noses
makeCreature(attributes: Attributes(color: .purple, noseCount: 2))

// use 10 eyes, and 1 nose (default)
makeCreatures(count: 3, attributes: Attributes(color: .blue, eyeCount: 10))

关于swift - 将默认参数值发送给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40314955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com