解码结构中的字符串或 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
中添加两个属性 intValue
和 stringValue
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!)!
我有一个结构,一些值会得到整数或字符串,所以我在我的结构中使用这个结构以正确的方式解析 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
intValue
和 stringValue
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!)!