Декодирование строки или значения int в структуре вернет строку ("1") в Swift 4 - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть структура, в которой некоторые значения получат Integer или строку, поэтому я использовал эту структуру в своей структуре для правильного анализа JSON, но проблема в том, что, когда я хочу напечатать значение, он будет печатать строку ("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 голосов
/ 22 декабря 2018

Если вы хотите напечатать значение без оболочки enum, просто добавьте description:

extension QuantumValue: CustomStringConvertible {
    public var description: String {
        switch self {
        case let .string(string):
            return string
        case let .int(number):
            return "\(number)"
        }
    }
}
0 голосов
/ 22 декабря 2018

QuantumValue объявлено как enum, оба хороших случая имеют связанные значения.

Таким образом, при печати значения печатается как регистр, так и соответствующее значение.

Вы можете добавить два свойства intValue и stringValue внутри QuantumValue

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* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10 *.

Переменные и функции: lowerCamelCased ans1

И, пожалуйста, объедините ваши дополнительные, 6 (шесть) вопросительных и восклицательных знаков в одну строкудовольно странно

(self.res?.response?.detailData?[indexPath.row].player1_result_sheet?.ans_1!)!
0 голосов
/ 22 декабря 2018

Ваш enum кейс string(String), поэтому он печатает case(value)

строка ("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 {
    ...
}
...