如何在Swift中根据字符串值返回枚举类型?

3

我正在尝试在playground中根据字符串分配枚举类型,但在changeType函数中出现错误。如何使其正常工作?

enum TransactionType {
    case purchase,charge
    case deposit,payment

    func description() -> String {
        switch self {
        case .purchase:
            return "purchase"
        case .charge:
            return "charge"
        case .deposit:
            return "deposit"
        case .payment:
            return "payment"
        }
    }

    func typeFromString(value:String) -> TransactionType   {
        switch value {
        case "charge":
            return .charge
        case "deposit":
            return .deposit
        case "payment":
            return .payment
        default:
            return .purchase
        }
    }
}

class Tester {
    var transactionType = TransactionType.purchase

    func changeType() {
        transactionType = TransactionType.typeFromString("charge")
    }
}

var tester = Tester()
print(tester.transactionType.description())

tester.changeType()
print(tester.transactionType.description())
2个回答

3
解决方案比您想象中的更简单:
enum TransactionType : String {
    case purchase = "purchase", charge = "charge"
    case deposit = "deposit", payment = "payment"
}

class Tester {
    var transactionType = TransactionType.purchase

    func changeType() {
        transactionType = TransactionType.fromRaw("charge")!
    }
}

var tester = Tester()
print(tester.transactionType.toRaw())

tester.changeType()
print(tester.transactionType.toRaw())

诀窍在于设置一个String类型的原始值,该值定义了与每个枚举情况相关联的类型。

更多信息请参见枚举中的原始值


我在想为什么我不能使用原始字符串值。谢谢! - Aaron Bratcher

1
你可以将typeFromString方法定义为静态的,以避免与可选值产生复杂性。毕竟,它只包含常量。只需在func定义之前添加单词static即可。
static func typeFromString(value:String) -> TransactionType   {

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接