带有相关值的Swift枚举

时间:2016-07-15 09:37:38

标签: swift enums

到目前为止,我一直在使用rawValue根据案例获取文本,如下例所示:

enum Level1: String {
    case question1 = "q1"
    case question2 = "q2"
    case question3 = "q3"
}

print(Level1.question1.rawValue)

但现在我想得到答案。我试图使它与相关的值一起工作,但我不知道如何将值分配给属性,或者即使它是可能的。例如:questionText =“q1”,answerText =“a1”。

enum Level2 {
    case question1(questionText: String, answerText: String);
    case question2(questionText: String, answerText: String);
    case question3(questionText: String, answerText: String);
}

4 个答案:

答案 0 :(得分:2)

具有关联值的枚举不能是字符串的类型。但他们可以实施例如CustomStringConvertible协议:

enum ScreenName: CustomStringConvertible {

    case Category(categoryId: String, categoryName: String)
    ...

    var description: String {
        switch (self) {
        case let .Category(_, categoryName):
            return "Category - \(categoryName)"
        ...
        }
    }
}

然后,您可以致电ScreenName.Category(categoryId: "1", categoryName: "products").description,然后您将获得"Category - products"

答案 1 :(得分:1)

您可以通过以下方式使用包含关联值的枚举:

enum Level2 {
    case question1(questionText: String, answerText: String)
    case question2(questionText: String, answerText: String)
    case question3(questionText: String, answerText: String)
}

// initialise
let level = Level2.question2(questionText: "Question", answerText: "Answer")

// read

switch level {
case .question1(let question, let answer):
    print(question + answer)
case .question2(let question, let answer):
    print("something")
case .question3(let question, let answer):
    print("something else")
}

我建议您在此处阅读更多内容:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html

P.S:如果你真的需要在你的情况下使用枚举而不是结构,我建议重新考虑。 使用结构的一个例子是:

struct Level {
    let question: String
    let answer: String
}

let levels = [Level]()

但这是另一个话题。我希望我已经回答了你的问题。

答案 2 :(得分:0)

关联值与RawRepresentable(您的第一个枚举)不同,因为它的值是在运行时分配的,并且每次使用都可能不同。基本上,具有相关值的枚举不适合您的需要。

试试这个:

struct Challenge {

    let question: String
    let answer: String?
}

struct Level1 {

    static let challenge1 = Challenge(question: "q1", answer: nil)
    static let challenge2 = Challenge(question: "q2", answer: nil)
    static let challenge3 = Challenge(question: "q3", answer: nil)
}

struct Level2 {

    static let challenge1 = Challenge(question: "q1", answer: "a1")
    static let challenge2 = Challenge(question: "q2", answer: "a3")
    static let challenge3 = Challenge(question: "q3", answer: "a3")
}

稍后你可以回复它们:

let currentChallenge = Level1.challenge2

答案 3 :(得分:-2)

我想我找到了我想要的答案。我将在下面发布我将要使用的代码应用于所使用的示例。谢谢你的回答。

$prod = function($a, $b) {
    return $a["retail_price"] - $b["retail_price"];
}

usort($products, $prod);