我是Swift的新手...
我遍历一手牌(以下未显示),并将每张牌与先前确定的最佳选择进行比较。如果它具有更好的值,请用此卡替换结构变量“ bestOption”,并指定适当的值(penaltyValue,该值可以是-5,-1、9、199,对这个问题无关紧要)。
因此,对于我手中的每张卡,我都会将该卡称为“ compareReplaceBestOption”。
bestOption变量(一个结构)最初是空的(无值),因此将用第一个卡和值填充。对于接下来的每张卡,我都会将卡与bestOption变量中的值进行比较(并可能将其替换)(该值将为某些值)。
这段代码很丑陋,可能有几个原因(所有建议都值得赞赏),但真正吸引我的是对变量bestOption(结构)的双重赋值。
问题:是否有一个更优雅的解决方案,所以只有一个分配(我可以创建一个执行该分配的小函数,但是在概念上我最终遇到了相同的问题)
两次发表这个声明会很痛...
bestOption = ( card
, newPenaltyValue
)
(辅助信息:g.cardStack [0]是前一回合中一张在堆叠中朝上的牌。将手牌与此牌进行比较)
//Find penalty and card for card in hand with lowest possible penalty
//AND without using the bonusChip
var bestOption: (card: Card!, penaltyValue: Int!)?
func compareReplaceBestOption(card: Card) {
let newPenaltyValue = card.nr - g.cardStack[0].nr - 1
if bestOption == nil { bestOption = ( card
, newPenaltyValue
)
} else
{ if ( newPenaltyValue < bestOption!.penaltyValue ) {
bestOption = ( card
, newPenaltyValue
)
}
}
}
最佳答案
为Swift 3.0更新:
if let best = bestOption, best.penaltyValue > newPenaltyValue {
best = (car, newPenaltyValue)
}
(实际上只是丢失了
where
子句。)旧的更新的答案:
重新考虑这个答案后,我认为我们可以改善这一点
迅速:
if let best = bestOption where best.penaltyValue > newPenaltyValue {
best = (car, newPenaltyValue)
}
我们使用可选的展开功能和
where
子句来提供一些其他案例以供检查(即使使用
现在展开的
best
)。更容易阅读,我们删除了讨厌的!
。原始答案:
怎么样:
if bestOption == nil || newPenaltyValue < bestOption!.penaltyValue {
bestOption = (car, newPenaltyValue)
}
关于swift - 可能删除重复的代码,是否有更优雅的解决方案?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31408946/