快速

时间:2016-08-11 11:00:43

标签: ios swift class object enums

我试图创建一个枚举类,其类型和函数返回所有类型。

最初我在我的对象类中有我的枚举和一个将这些作为数组返回的函数:

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

我想从我的对象类中提取它的原因是因为这种类型也在其他类中使用,我不想复制任何不必要的代码。

我可以设法枚举枚举,但不能返回返回数组中所有类型的函数。

任何帮助将不胜感激。

6 个答案:

答案 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)

雨燕5

现在您有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 docsAnother topic

  

符合CaseIterable协议的类型通常是   没有关联值的枚举。使用CaseIterable时   类型,您可以使用来访问所有类型案例的集合   该类型的allCases属性。

CaseIterable

答案 5 :(得分:0)

如果它也被用于其他课程,那就不要把它放在课堂上

class YourClass : Mappable {

}

enum Type: Int {
    case A = 0
    case B = 1
    case C = 2
        }
    }
}