解码字符串或结构中的int值将在Swift 4中返回string(“ 1”)

时间:2018-12-22 10:11:50

标签: swift decode decodable

我有一个结构,某些值将得到Integer或string,所以我在结构中使用了此结构以正确的方式解析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!)!

3 个答案:

答案 0 :(得分:1)

您的enum大小写为string(String),因此它显示case(value)

  

string(“ 1”)

您可以通过在enum内创建变量来解决该问题,该变量会根据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 {
    ...
}

答案 1 :(得分:1)

如果要在不使用枚举包装的情况下打印该值,只需实现description

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

答案 2 :(得分:1)

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

因此,打印值会同时打印大小写和相关值。

您可以在intValue内添加两个属性stringValueQuantumValue

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

请遵守命名约定。

  • 结构,类和枚举是 UpperCamelCased Player1ResultSheet
  • 变量和函数为 lowerCamelCased ans1

请把您的可选内容,6(六个)问题和感叹号合并到一行很奇怪

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