【发布时间】:2016-10-29 00:49:07
【问题描述】:
TL;DR
如果我有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)
}
}
这样做的问题是,如果默认的眼睛数量发生变化,我需要记住在两个地方更新它:makeCreature 和 makeCreatures。
我希望做的是将方法定义为:
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 的 DRYness?类似的东西:
理想的解决方案?
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 用于eyeCount,1 用于noseCount)。
如果没有,还有哪些其他解决方案可以帮助我实现这一目标?
【问题讨论】:
-
只需在两个函数都可用的某个范围内设置两个 Int 常量,并将它们设为函数的默认参数。也不需要选项。
-
我很好奇为什么你的
makeCreature不是Creature的初始化器。