gpt4 book ai didi

swift - 关联值符合 CaseIterable、RawRepresentable 的枚举

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:57 24 4
gpt4 key购买 nike

我试图使具有关联值的枚举符合 CaseIterable、RawRepresentable。当通过 rawValue 初始化时,我对关联值的一些默认值没问题。

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]
}
}

有没有什么办法可以不用手动切换所有情况,即没有这样的代码:

    typealias RawValue = Int
var rawValue: Int {
switch self {
case .unknown:
return 0
case .blues:
return 1
case .classical:
return 2
}
}

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

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"
}

最佳答案

我终于可以使用 Mirror 了!

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
})!
}

不要介意力展开,这里很安全。

关于swift - 关联值符合 CaseIterable、RawRepresentable 的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55212028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com