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)
}
}
然而,現在我們要輕鬆地定製eyeCount和noseCount爲makeCreatures
。要做到這一點的方法之一是重新定義的參數和它們的默認值:
解決方案#1
func makeCreatures(count: Int, color: UIColor, eyeCount: Int = 2, noseCount: Int = 1) {
for 1...count {
makeCreature(color: color, eyeCount: eyeCount, noseCount: noseCount)
}
}
這樣做的問題是,如果眼睛的默認數量都沒有改變,我需要記住將其更新爲2個位置: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的乾燥程度?類似的東西:
理想的解決方案?
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常量,即a nd使它們成爲函數的默認參數。不需要可選項。 – BallpointBen
我很好奇爲什麼你的'makeCreature'不是'Creature'上的初始化器。 – Alexander