快速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 }
在这个片段中我们可以看到一些重要的事情:
- 像ONE和TWO这样的情况必须用Swift 文字来表示,请检查这个Swift 2文章中的可用文字列表(int,string,array,dictionary等)。 但请注意,在Swift 3中,在Big Swift Rename之后, LiteralConvertible协议现在称为ExpressibleByXLiteral 。
- 实现
RawRepresentable
的要求包括实现一个Expressible协议(init?(rawValue:)
将利用我们编写的初始化器来支持文字)。 - 枚举也必须是Equatable ,所以你必须为你的
CustomStruct
基类实现相等运算符。
根据文件 :
如果为每个枚举情况提供了一个值(称为“原始”值),则该值可以是string,字符或任何整数或浮点types的值。
所以是的,你不能设置一个结构types为枚举的原始值。
在你的情况下,我会build议使用string
作为枚举原始值和一些字典映射到CUSTOM_STRUCT
types的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) ?? "" } }