快速3.0的结构枚举

我想创build一个结构,我想要初始化的枚举

struct CustomStruct { var variable1: String var variable2: AnyClass var variable3: Int init (variable1: String, variable2: AnyClass, variable3: Int) { self.variable1 = variable1 self.variable2 = variable2 self.variable3 = variable3 } } enum AllStructs: CustomStruct { case getData case addNewData func getAPI() -> CustomStruct { switch self { case getData: return CustomStruct(variable1:"data1", variable2: SomeObject.class, variable3: POST) case addNewData: // same to same default: return nil } } } 

我得到以下错误

typesAllStructs不符合协议“RawRepresentable”

我假设枚举不能用这种方式? 我们必须使用原语。

它应该是:

 struct CustomStruct { var apiUrl: String var responseType: AnyObject var httpType: Int init (variable1: String, variable2: AnyObject, variable3: Int) { self.apiUrl = variable1 self.responseType = variable2 self.httpType = variable3 } } enum MyEnum { case getData case addNewData func getAPI() -> CustomStruct { switch self { case .getData: return CustomStruct(variable1: "URL_TO_GET_DATA", variable2: 11 as AnyObject, variable3: 101) case .addNewData: return CustomStruct(variable1: "URL_TO_ADD_NEW_DATA", variable2: 12 as AnyObject, variable3: 102) } } } 

用法:

 let data = MyEnum.getData let myObject = data.getAPI() // this should logs: "URL_TO_GET_DATA 11 101" print(myObject.apiUrl, myObject.responseType, myObject.httpType) 

请注意,根据命名约定,struct应该命名为CustomStruct ,枚举命名为MyEnum

实际上,我不确定是否需要让CustomStruct成为MyEnum的父MyEnum来实现你想要的function; 正如上面在片段中所提到的,您可以根据引用枚举的值返回结构的一个实例。

希望这有助于。

我没有评论在这里使用枚举的select,而只是解释为什么你得到这个错误,以及如何声明一个具有自定义对象作为父项的枚举

错误显示你的问题, CustomStruct必须实现RawRepresentable作为该枚举的基类。

这是一个简单的例子,向您显示您需要做的事情:

 struct CustomStruct : ExpressibleByIntegerLiteral, Equatable { var rawValue: Int = 0 init(integerLiteral value: Int){ self.rawValue = value } static func == (lhs: CustomStruct, rhs: CustomStruct) -> Bool { return lhs.rawValue == rhs.rawValue } } enum AllStructs: CustomStruct { case ONE = 1 case TWO = 2 } 

在这个片段中我们可以看到一些重要的事情:

  1. 像ONE和TWO这样的情况必须用Swift 文字来表示,请检查这个Swift 2文章中的可用文字列表(int,string,array,dictionary等)。 但请注意,在Swift 3中,在Big Swift Rename之后, LiteralConvertible协议现在称为ExpressibleByXLiteral
  2. 实现RawRepresentable的要求包括实现一个Expressible协议( init?(rawValue:)将利用我们编写的初始化器来支持文字)。
  3. 枚举也必须Equatable ,所以你必须为你的CustomStruct基类实现相等运算符。

根据文件 :

如果为每个枚举情况提供了一个值(称为“原始”值),则该值可以是string,字符或任何整数或浮点types的值。

所以是的,你不能设置一个结构types为枚举的原始值。

在你的情况下,我会build议使用string作为枚举原始值和一些字典映射到CUSTOM_STRUCTtypes的string。

你是否试图遵循RawRepresentable像错误是问?

使用JSON表示应该适用于variables1和variables3。 variables2可能需要一些额外的工作。

 struct CustomStruct: RawRepresentable { var variable1: String var variable2: AnyClass var variable3: Int init?(rawValue: String) { guard let data = rawValue.data(using: .utf8) else { return nil } guard let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else { return nil } self.variable1 = (json["variable1"] as? String) ?? "" self.variable2 = (json["variable2"] as? AnyClass) ?? AnyClass() self.variable3 = (json["variable3"] as? Int) ?? 0 } var rawValue: String { let json = ["variable1": self.variable1, "variable2": self.variable2, "variable3": self.variable3 ] guard let data = try? JSONSerialization.data(withJSONObject: json, options: []) else { return "" } return String(data: data, encoding: .utf8) ?? "" } }