删除重复的代码,是否有更优雅的解决方案?

时间:2015-07-14 14:03:42

标签: swift

我是Swift的新手......

我循环通过一手牌(下面未显示),并将每张牌与之前确定的最佳选项进行比较。如果它具有更好的值,则替换struct变量" bestOption"用这张卡和适当的值(penaltyValue,这是任意的,可以是-5,-1,9,199,对这个问题不重要)。

因此,对于我手中的每张牌,我都会打电话给#34; compareReplaceBestOption"那张卡片。

bestOption变量,一个结构,最初是空的(NONE值),因此将填充第一张卡和值。对于每个后续卡,我将卡与bestOption变量中的值进行比较(并可能替换)(具有某种值)。

这段代码很丑陋可能有几个原因(所有建议都很受欢迎),但真正打击ME的是对变量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
                                                  )
                                }
                             }
    }

1 个答案:

答案 0 :(得分:1)

针对Swift 3.0进行了更新

if let best = bestOption, best.penaltyValue > newPenaltyValue {
    best = (car, newPenaltyValue)
}

(真的只是丢失了where条款。)

旧的更新答案:

  

在重新审视这个答案之后,我认为我们可以进一步改进   SWIFTY:

if let best = bestOption where best.penaltyValue > newPenaltyValue {
    best = (car, newPenaltyValue)
}
     

我们使用可选的展开功能和where - 子句来实现   提供一些额外的案例来检查(即使使用   now-unwrapped best)。更容易阅读,我们放弃了那令人讨厌的!

原始答案:

  

怎么样:

if bestOption == nil || newPenaltyValue < bestOption!.penaltyValue {
    bestOption = (car, newPenaltyValue)
}