如何在Swift中获取枚举值的名称?

226

如果我有一份使用原始Integer值的枚举:

enum City: Int {
  case Melbourne = 1, Chelyabinsk, Bursa
}

let city = City.Melbourne

我如何将city的值转换为字符串 Melbourne?语言中是否有此类类型名称内省的功能?

类似这样的操作(以下代码无法运行):

println("Your city is \(city.magicFunction)")
> Your city is Melbourne
12个回答

1

Swift枚举类型中的内省似乎只能部分工作。

我看到了@drewag的回答,并发现在Swift 5.X和Xcode 11.5中,没有原始值的枚举确实可以进行内省。这段代码有效。

public enum Domain: String {
    case network
    case data
    case service
    case sync
    var description: String {
        return "\(self)"     // THIS INTROSPECTION WORKS
    }
}
enum ErrorCode: Int, CustomStringConvertible {
    case success = 200
    case created = 201
    case accepted = 202
    case badRequest = 400
    case unauthorized = 401
    case forbidden = 403
    case notFound = 404
    var code: Int {
        return self.rawValue
    }
    var description: String {
        return "\(self)"      //THIS DOES NOT WORK - EXEC_BAD_ACCESS
    }
}
let errorCode = ErrorCode.notFound
let domain = Domain.network
print(domain.description, errorCode.code, errorCode.description)

在第二个枚举中,用"string"替换"\(self)",即可得到以下输出:network 404 string。
注意:在第一个枚举中使用String(self)代替"\(self)"将需要该枚举符合LosslessStringConvertible协议,并添加其他初始化程序,因此字符串内插似乎是一个不错的解决方法。
要向枚举添加var description: String,您将需要使用Switch语句,并列出所有先前提到的枚举情况。
var description: String {
    switch self {
    case .success: return "Success"
    case .created: return "Created"
    case .accepted: return "Accepted"
    }
}

2
在您的 ErrorCode 枚举中,"(self)" 应该可以工作。您在那里遇到 EXEC_BAD_ACCESS 的原因是由于 description 上的无限递归。如果您删除 var description 实现,并独立编写类似 print("\(ErrorCode.success)") 的内容,您将能够很好地获取枚举案例名称。 - John Estropia
返回 "(self)" 是有效的。我是从你那里学到的。 - Mert Köksal

-1

简单但有效...

enum ViewType : Int {
    case    Title
    case    Buttons
    case    View
}

func printEnumValue(enum: ViewType) {

    switch enum {
    case .Title: println("ViewType.Title")
    case .Buttons: println("ViewType.Buttons")
    case .View: println("ViewType.View")
    }
}

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