You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中结构体嵌套枚举的Switch语句使用优化问询

优化Swift手牌计分的Switch匹配逻辑

我来帮你搞定这个Switch语句的优化问题~首先明确你的核心需求:在Swift 4.1、Xcode 9.3.1环境下,直接在Switch分支里匹配红桃牌后紧跟3/5/7/9数字牌的场景,替代原来用数组临时判断的方案。

先补全你提到的基础代码结构(贴合Swift常规写法,方便对应逻辑):

enum Suit {
    case Hearts, Diamonds, Clubs, Spades
}

enum Rank {
    case Ace, King, Queen, Jack
    case Num(Int)
}

struct Card: Equatable {
    let suit: Suit
    let rank: Rank
}

正确的Switch匹配实现

下面是优化后的countHand(_:)函数,直接在Switch分支内完成两个规则的精准匹配,无需额外数组判断:

func countHand(_ cards: [Card]) -> Int {
    var totalScore = 0
    
    // 遍历所有连续牌对(前一张+后一张)
    for (firstCard, secondCard) in zip(cards, cards.dropFirst()) {
        switch (firstCard, secondCard) {
        // 规则1:方块5后紧跟任意Ace,加100分
        case (
            let card where card.suit == .Diamonds && card.rank == .Num(5),
            let card where card.rank == .Ace
        ):
            totalScore += 100
            
        // 规则2:红桃牌后紧跟3/5/7/9的数字牌,加牌面值的2倍
        case (
            let card where card.suit == .Hearts,
            .init(suit: _, rank: .Num(let value))
        ) where [3, 5, 7, 9].contains(value):
            totalScore += value * 2
            
        default:
            break
        }
    }
    
    return totalScore
}

写法细节解释

  1. 规则1的匹配逻辑:通过where子句分别限定第一张牌是「方块5」,第二张牌是任意花色的Ace,逻辑直接清晰。
  2. 规则2的优化核心:
    • 第一个元素用where子句锁定为红桃牌;
    • 第二个元素直接通过结构体模式匹配Rank.Num(let value),绑定数字牌的面值;
    • 最后用where子句过滤value必须是3/5/7/9中的一个,完美替代原来的数组判断逻辑。

你之前写法报错的原因

大概率是你尝试在Case里直接枚举.Num(3)/.Num(5)等值,但Swift的Switch Case要求是单一模式,无法同时匹配多个不同的.Num值。正确的思路是先绑定数值变量,再用where子句过滤合法范围,既符合Swift模式匹配语法,又能精准实现需求。

内容的提问来源于stack exchange,提问作者Noah Wilder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:56:17