【问题标题】:allCase enum with parameter带参数的 allCase 枚举
【发布时间】:2021-10-08 08:51:07
【问题描述】:

如何实现协议或替代解决方案,以在每种情况下都拥有参数的所有内容。类似League.teamA (.allCases)

import Cocoa

enum PlayerA: CaseIterable {
    case center
    case powerForward
    case smallForward
}

enum PlayerB: CaseIterable {
    case pointGuard
    case shootingGuard
}

protocol EnumProtocol {
    var description: String { get }
}

enum League: EnumProtocol {
    case teamA(PlayerA)
    case teamB(PlayerB)
}

extension League {
    var description: String {
        switch self {
        case let .teamA(player):
            switch player {
            case .center: return "Center"
            case .smallForward: return "Small Forward"
            case .powerForward: return "Power Forward"
            }
        case let .teamB(player):
            switch player {
            case .pointGuard: return "Point Guard"
            case .shootingGuard: return "Shooting Guard"
            }
        }
    }
}

League.teamA(.smallForward).description

//League.teamA(.allCases)
//League.teamB(.allCases)

【问题讨论】:

  • 您真正想要实现的目标是什么? allCases 是一个数组,而目前您的关联值是奇异值,因此您需要澄清是否希望能够将单个玩家或一组玩家传递给枚举案例。
  • 确切地说,获取一个包含案例League.teamA (.allCases) 和单个League.teamA (. powerForward) 的所有元素的数组。我知道allcases 不正确。我可以采用什么解决方案?

标签: swift enums


【解决方案1】:

如果您希望能够同时传递单个实例和实例数组,最简单的解决方案是将关联类型声明为数组,因为这样您就可以传递具有单个元素的数组,以防万一传递单个实例,或者您也可以传递allCases

enum PlayerA: CaseIterable {
    case center
    case powerForward
    case smallForward
}

extension PlayerA: CustomStringConvertible {
    var description: String {
        switch self {
        case .center: return "Center"
        case .smallForward: return "Small Forward"
        case .powerForward: return "Power Forward"
        }
    }
}

enum PlayerB: CaseIterable {
    case pointGuard
    case shootingGuard
}

extension PlayerB: CustomStringConvertible {
    var description: String {
        switch self {
        case .pointGuard: return "Point Guard"
        case .shootingGuard: return "Shooting Guard"
        }
    }
}

protocol EnumProtocol {
    var description: String { get }
}

enum League: EnumProtocol {
    case teamA([PlayerA])
    case teamB([PlayerB])
}

extension League: CustomStringConvertible {
    var description: String {
        switch self {
        case let .teamA(players):
            return players.description
        case let .teamB(players):
            return players.description
        }
    }
}

League.teamA([.smallForward]).description
League.teamA(PlayerA.allCases)
League.teamB(PlayerB.allCases)

【讨论】:

  • 谢谢,这可能很好,但也许我使用了一些错误的逻辑,这让我没有太大的灵活性。我也会尝试从this 那里得到启发
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
相关资源
最近更新 更多