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)
}
}
Проблема в том, что если количество глаз по умолчанию когда-либо изменится, мне нужно помнить, чтобы обновить его в двух местах: 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
).
Если нет, то какие другие решения могут помочь мне достичь этой цели?
makeCreature
не является инициализаторомCreature
. - person Alexander   schedule 29.10.2016