Swift中的元组的枚举
这是可能创build一个元组的枚举在Swift中?
我想build立一些像:
enum ErrorCode: (Int, String) { case Generic_Error = (0, "Unknown") case DB_Error = (909, "Database") }
但它不编译…有没有办法获得类似的结果?
这取决于你的意思是“相似”。 我所做的是使用具有静态常量属性的Struct:
struct Trouble { static let Generic_Error = (0, "Unknown") static let DB_Error = (909, "Database") }
现在像Trouble.Generic_Error
这样的东西可以在你的代码中使用。
Swift枚举不能将Tuples作为原始值types。
替代方法包括存储代码并从中得出描述:
enum ErrorCode: Int, CustomStringConvertible { case Generic = 0 case DB = 909 var description: String { switch self { case .Generic: return "Unknown" case .DB: return "Database" } } }
…或在枚举案例本身中存储代码和描述的相关值:
enum Error { case Generic(Int, String) case DB(Int, String) }
如果你只是在寻找不变的价值观,那么@亚特在一个struct
中组织它们的build议也是可行的。
你可以做这样的事情,也许:
enum ErrorCode { case Generic_Error case DB_Error func values() -> (code: Int!, description: String?)! { switch self { case .Generic_Error: return (0, "Unknown") case .DB_Error: return (909, "Database") } } }
你可以稍后做这样的事情:
let errorCode: ErrorCode = ErrorCode.Generic_Error; if (errorCode.values().code == 0) { // do the business here... }
您可以遵循RawRepresentable
并使用(Int, String)
作为Self.RawValue
关联的types。
enum ErrorCode: RawRepresentable { case Generic_Error case DB_Error var rawValue: (Int, String) { switch self { case .Generic_Error: return (0, "Unknown") case .DB_Error: return (909, "Database") } } init?(rawValue: (Int, String)) { switch rawValue { case (0, "Unknown"): self = .Generic_Error case (909, "Database"): self = .DB_Error default: return nil } } }
类似于@holex的解决scheme,但是可以使用var来代替函数。
enum SomeType { case type1 case type2 case type3 var typeNameAndDescription: (name: String, description: String) { switch self { case .type1: return ("type1 name", "type1 description") case .type2: return ("type2 name", "type2 description") case .type3: return ("type3 name", "type3 description") } } }
然后:
let myType = SomeType.type1 let typeName = myType.typeNameAndDescription.name let typeDescription = myType.typeNameAndDescription.description