首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有符合CaseIterable、RawRepresentable的关联值的枚举

具有符合CaseIterable、RawRepresentable的关联值的枚举
EN

Stack Overflow用户
提问于 2019-03-18 05:18:14
回答 2查看 5.7K关注 0票数 13

我正在尝试使具有关联值的枚举符合CaseIterable、RawRepresentable。在使用rawValue进行初始化时,我可以为关联值设置一些默认值。

代码语言:javascript
复制
enum GenresAssociated: CaseIterable, RawRepresentable, Equatable {
    case unknown(String)
    case blues(String)
    case classical(String)
    // Implementing CaseIterable
    typealias AllCases = [GenresAssociated]
    // Enums can have no storage, but the class they are in CAN. Note 'static' in declaration
    static var allCases: [GenresAssociated] = [.unknown(""), .blues(""), .classical("")]


    typealias RawValue = Int
    var rawValue: Int {

        // MARK: This causes a crash for unknown reason
        return GenresAssociated.allCases.firstIndex(where: {  if case self = $0 { return true } else { return false } } ) ?? 0
    }
    init?(rawValue: Int) {
        guard GenresAssociated.allCases.indices.contains(rawValue) else { return nil }
        self = GenresAssociated.allCases[rawValue]
    }
}

有没有办法在不通过所有情况手动切换的情况下实现它,即没有这样的代码:

代码语言:javascript
复制
    typealias RawValue = Int
    var rawValue: Int {
        switch self {
        case .unknown:
            return 0
        case .blues:
            return 1
        case .classical:
            return 2
        }
    }

值得注意的是,非常相似的代码可以很好地工作,例如

代码语言:javascript
复制
enum EnumWithValue {
    case one(NSString!), two(NSString!), three(NSString!)
}

let arrayOfEnumsWithValues: [EnumWithValue] = [.one(nil), .two(nil), .three("Hey")]

if let index = arrayOfEnumsWithValues.firstIndex(where: { if case .two = $0 { return true }; return false }) {
    print(".two found at index \(index)") //prints ".two found at index 1"
}
EN

回答 2

Stack Overflow用户

发布于 2019-03-18 06:31:10

我终于可以和Mirror一起工作了!

代码语言:javascript
复制
var rawValue: Int {
    let selfCaseName = Mirror(reflecting: self).children.first!.label!

    return GenresAssociated.allCases.firstIndex(where: { (genre) in
        let switchingCaseName = Mirror(reflecting: genre).children.first!.label!

        return switchingCaseName == selfCaseName
    })!
}

不要介意用力打开,在这里是安全的。

票数 5
EN

Stack Overflow用户

发布于 2021-08-10 23:35:54

此参数适用于同时包含rawValue案例和带有associatedValues的案例的枚举:

代码语言:javascript
复制
var caseName: String { 
   let result = String(describing: self)
   let assocValName = Mirror(reflecting: self).children.first?.label ?? "failed"

   return !result.contains("(") ? result : assocValName
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55212028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档