我有一个结构,某些值将得到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!)!
答案 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
内添加两个属性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
的名称很像 php-ish 。
请遵守命名约定。
Player1ResultSheet
ans1
请把您的可选内容,6(六个)问题和感叹号合并到一行很奇怪
(self.res?.response?.detailData?[indexPath.row].player1_result_sheet?.ans_1!)!