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
相关产品推荐
相关产品推荐

