Swift 3.0中结构的枚举
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift 3.0中结构的枚举相关的知识,希望对你有一定的参考价值。
我正在尝试创建一个我想初始化的结构的枚举:
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
}
}
}
我收到以下错误:
Type AllStructs不符合协议'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
的父母来实现你想要的东西;如上面的片段中所述,您可以根据引用的枚举的值返回结构的实例。
另一答案
我不是在评论在这里使用枚举的选择,而只是解释为什么你得到了这个错误以及如何声明一个自定义对象作为父对象的枚举。
错误显示问题,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文字表示,检查this Swift 2 post以获取可用文字列表(int,string,array,dictionary等)。但请注意,在Swift 3中,LiteralConvertible协议现在在Big Swift Rename之后被称为ExpressibleByXLiteral。
- 实现
RawRepresentable
的要求包括实现一个Expressible协议(init?(rawValue:)
将利用我们编写的支持文字的初始化程序)。 - 枚举也必须是Equatable,因此您必须为
CustomStruct
基类型实现相等运算符。
另一答案
您是否尝试过符合RawRepresentable,就像错误要求一样?
使用JSON表示应该适用于variable1和variable3。变量2可能需要一些额外的工作。
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) ?? ""
}
}
另一答案
如果为每个枚举情况提供了一个值(称为“原始”值),则该值可以是字符串,字符或任何整数或浮点类型的值。
所以,是的,您不能将结构类型设置为枚举的原始值。
在你的情况下,我建议使用string
作为枚举原始值和一些字典将这些字符串映射到CUSTOM_STRUCT
类型。
以上是关于Swift 3.0中结构的枚举的主要内容,如果未能解决你的问题,请参考以下文章