我试图创建一个枚举类,其类型和函数返回所有类型。
最初我在我的对象类中有我的枚举和一个将这些作为数组返回的函数:
class someClass: Mappable {
enum Type: Int {
case A = 0
case B = 1
case C = 2
}
}
}
func getAllTypes() -> [Type] {
return [Type.A, Type.B, Type.C]
}
}
我想从我的对象类中提取它的原因是因为这种类型也在其他类中使用,我不想复制任何不必要的代码。
我可以设法枚举枚举,但不能返回返回数组中所有类型的函数。
任何帮助将不胜感激。
答案 0 :(得分:4)
all
AnyGenerator
@vacawama展示了如何使用仅执行一次性的闭包以及all
init(rawValue:)
的可用enum
初始化器,以通用方式初始化while
数组的。前面提到的答案中方法的略微变化是交换明确的AnyGenerator
循环和附加enum Type: Int {
case A = 0, B, C, D, E, F, G, H
static let all: [Type] = {
var rValue = 0
return AnyGenerator<Type> {
defer { rValue += 1 }
return Type(rawValue: rValue)
}.map{$0}
}()
}
print(Type.all)
// [Type.A, Type.B, Type.C, Type.D, Type.E, Type.F, Type.G, Type.H]
的数组:
rawValue
这可以在++
只是0, 1, 2, ...
增加(all
)的条件下工作。
enum
符合SequenceType
rawValue
作为另一种选择,由于您的++
是整数顺序的(enum
),因此您可以让SequenceType
符合.map
,在这种情况下只需使用enum Type: Int, SequenceType {
case A = 0, B, C, D, E, F, G, H
init() { self = A } // Default (first) case intializer
/* conform Type to SequenceType (here: enables only
simple (self.rawValue)...last traversing) */
func generate() -> AnyGenerator<Type> {
var rValue = self.rawValue
return AnyGenerator {
defer { rValue += 1 }
return Type(rawValue: rValue)
}
}
/* use the fact that Type conforms to SequenceType to neatly
initialize your static all array */
static let all = Type().map { $0 }
}
print(Type.all)
// [Type.A, Type.B, Type.C, Type.D, Type.E, Type.F, Type.G, Type.H]
all
仅应用此一致性 来初始化静态enum
数组可能有点过分,但如果您希望能够使用{的其他方面,则这是一个合理的选择{1}}符合SequenceType
for typeCase in Type() {
// treat each type ...
print(typeCase, terminator: " ")
} // A B C D E F G H
for caseFromEAndForward in Type.E {
print(caseFromEAndForward, terminator: " ")
} // E F G H
flatMap
根据范围rawValue
最后,作为@appzYourLife neat solution的变体,如果您的案例很多,您可以在flatMap
的范围内使用rawValue
操作来初始化静态{{} 1}}数组,例如
allValues
然而,对于这种方法没有任何实际用途,因为对于许多情况的枚举,一般大小方法(@vacawama:s或上面的enum Type: Int {
case A = 0, B, C, D, E, F, G, H
static let all = (A.rawValue...H.rawValue)
.flatMap{ Type(rawValue: $0) }
}
print(Type.all)
// [Type.A, Type.B, Type.C, Type.D, Type.E, Type.F, Type.G, Type.H]
)总是更好。我可以看到的可能用例是,不同案例的SequenceType
是顺序,而不仅仅是rawValue
,例如如果++
用于某些位掩码
rawValue
上述方法将在// ...
case A = 0, B = 2, C = 4, D = 8, E = 16, F = 32, G = 64, H = 128
的范围内使用强制方法,其中少数将实际对应于实际情况。有点浪费,但由于它是一次性静态初始化,这不应该是一个问题。
答案 1 :(得分:3)
为什么不简单地在枚举类型中添加静态属性?
enum Type: Int {
case A = 0, B, C
static let all = [A, B, C]
}
答案 2 :(得分:1)
您可以定义一个包含所有可能的枚举值的静态数组:
static let allValues = [A, B, C]
然后你可以在任何你想要的地方使用它:
var allEnumValues = Type.allValues
答案 3 :(得分:1)
如果您的rawValue
是顺序Int
,则可以利用Type(rawValue:)
初始值设定项失败并返回nil
非法值来计算Type.all
的事实{1}}自动,无需明确列出值或设置范围。如果您在枚举中添加更多个案,它会自动调整:
enum Type: Int {
case A, B, C, D, E, F, G, H, I, J, K
static let all: [Type] = {
var all: [Type] = []
var value = 0
while let e = Type(rawValue: value) {
all.append(e)
value += 1
}
return all
}()
}
print(Type.all)
[Type.A, Type.B, Type.C, Type.D, Type.E, Type.F, Type.G, Type.H, Type.I, Type.J, Type.K]
答案 4 :(得分:1)
现在您有ggplot(profitCountries, aes(residence)) +
geom_bar(aes(y = (revenue), fill="Revenue"), stat="identity",
color = "black") +
geom_bar(aes(y = -(total_spend), fill="Campaign Spending"), stat="identity",
color = "black") +
geom_line(aes(y = total_profit, group = 1, color = "Net"), size = 2) +
scale_y_continuous(breaks = seq(-500000,500000,100000), limits=c(-500000, 500000) ) +
xlab('Countries') +
ggtitle('Campaign spending and revenue by countries') +
ylab('Campaign spending Revenue') +
theme_grey() +
scale_fill_manual(values = c("Revenue" = "darkgreen", "Campaign Spending" = "red")) +
scale_color_manual(values = c("Net" = "blue"))
。 Apple docs。 Another topic。
符合CaseIterable协议的类型通常是 没有关联值的枚举。使用CaseIterable时 类型,您可以使用来访问所有类型案例的集合 该类型的allCases属性。
CaseIterable
答案 5 :(得分:0)
如果它也被用于其他课程,那就不要把它放在课堂上
class YourClass : Mappable {
}
enum Type: Int {
case A = 0
case B = 1
case C = 2
}
}
}