解码结构中的字符串或 int 值将 return string("1") in Swift 4

Decode string or int value in structure will return string("1") in Swift 4

我有一个结构,一些值会得到整数或字符串,所以我在我的结构中使用这个结构以正确的方式解析 JSON 但问题是当我想打印值时它将打印 string("1") 而不是 1。

 public struct  player1_result_sheet : Decodable {
    let ans_1 : QuantumValue?
    let ans_2 : QuantumValue?
    let ans_3 : QuantumValue?
    let ans_4 : QuantumValue?
}
 enum QuantumValue: Decodable {

    case int(Int), string(String)

    init(from decoder: Decoder) throws {
        if let int = try? decoder.singleValueContainer().decode(Int.self) {
            self = .int(int)
            return
        }
        if let string = try? decoder.singleValueContainer().decode(String.self) {
            self = .string(string)
            return
        }
        throw QuantumError.missingValue
    }
    enum QuantumError:Error {
        case missingValue
    }
}

这是解码后的打印:

(self.res?.response?.detailData?[indexPath.row].player1_result_sheet?.ans_1!)!

你的 enum 案例是 string(String) 所以它打印 case(value)

string("1")

您可以通过在 enum 中创建变量来解决它 returns 您的值取决于 QuantumValue

的大小写
var value: Any {
    switch self {
    case .int(let value):
        return value
    case .string(let value):
        return value
    }
}

那么你可以这样使用它:

...ans_1!.value)!

1

另请注意,值的类型是 Any,因此如果您想将其作为 String 使用,则必须向下转型

if let string = ...ans_1.value)! as? String {
    ...
}

如果你想在没有枚举包装器的情况下打印值,只需实现 description:

extension QuantumValue: CustomStringConvertible {
    public var description: String {
        switch self {
        case let .string(string):
            return string
        case let .int(number):
            return "\(number)"
        }
    }
}

QuantumValue 被声明为枚举,两个 good 案例都有关联值。

因此打印一个值会同时打印大小写和关联值。

您可以在 QuantumValue

中添加两个属性 intValuestringValue
var intValue : Int? {
    guard case .int(let num) = self else { return nil }
    return num
}

var stringValue : String? {
    guard case .string(let string) = self else { return nil }
    return string
}

然后你可以打印

player1_result_sheet?.ans_1?.intValue

顺便说一句 player1_result_sheet 这个名字很漂亮 php-ish.

请遵守命名规范。

  • 结构,类 和枚举是 UpperCamelCasedPlayer1ResultSheet
  • 变量和函数是lowerCamelCasedans1

请合并您的选项,一行 6(六)个问题和感叹号很奇怪

(self.res?.response?.detailData?[indexPath.row].player1_result_sheet?.ans_1!)!