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
}

我们在此代码段中可以看到一些重要的事情:

  1. 像ONE和TWO这样的情况必须用Swift文字表示,检查this Swift 2 post以获取可用文字列表(int,string,array,dictionary等)。但请注意,在Swift 3中,LiteralConvertible协议现在在Big Swift Rename之后被称为ExpressibleByXLiteral。
  2. 实现RawRepresentable的要求包括实现一个Expressible协议(init?(rawValue:)将利用我们编写的支持文字的初始化程序)。
  3. 枚举也必须是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) ?? ""
    }
}
另一答案

根据documentation

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

所以,是的,您不能将结构类型设置为枚举的原始值。

在你的情况下,我建议使用string作为枚举原始值和一些字典将这些字符串映射到CUSTOM_STRUCT类型。

以上是关于Swift 3.0中结构的枚举的主要内容,如果未能解决你的问题,请参考以下文章

如何区分 Swift 3.0 中的类(确定它不是结构或枚举)[重复]

声明枚举路由器 Alamofire swift 3.0

Swift的闭包,枚举,类和结构体

swift 笔记 —— 方法(类,结构体,枚举)

Swift 常量:结构或枚举

iOS-swift-枚举和结构体