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

Swift如何实现协议或替代方案支持League.teamA(.allCases)枚举调用

实现方案

现有代码中League的teamA、teamB case仅支持传入单个对应球员枚举实例,而PlayerA.allCases、PlayerB.allCases是对应枚举的实例数组,类型不匹配导致无法直接调用。


方案1:重载静态方法,匹配你需要的调用习惯

直接给League扩展对应团队的静态重载方法,支持传入球员数组返回League实例数组:

extension League {
    static func teamA(_ players: [PlayerA]) -> [League] {
        players.map { .teamA($0) }
    }
    
    static func teamB(_ players: [PlayerB]) -> [League] {
        players.map { .teamB($0) }
    }
}

实现后即可直接运行你注释的写法:

// 成功返回所有teamA对应的League实例数组
let allTeamA = League.teamA(.allCases)
// 成功返回所有teamB对应的League实例数组
let allTeamB = League.teamB(.allCases)

// 可直接链式调用拿到所有描述
print(allTeamA.map(\.description))
// 输出:["Center", "Power Forward", "Small Forward"]

该方案和你期望的调用形式完全一致,新增团队时只需要对应加一个重载方法即可,可读性很高。


方案2:通用泛型实现(适合团队数量多的场景)

如果后续会新增大量团队枚举,可以用泛型实现通用的批量转换方法,避免重复写重载代码:

extension League {
    static func all<T: CaseIterable>(for caseGenerator: (T) -> League) -> [League] {
        T.allCases.map(caseGenerator)
    }
}

// 调用示例
let allTeamA = League.all(for: League.teamA)
let allTeamB = League.all(for: League.teamB)

这个方案不需要每次新增团队都写新的重载,但是调用写法和你要求的有差异,可根据实际业务场景选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:54:03