我是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/

10-11 09:18