我通过API的JSON响应接收到一组整数(我将其转换为[String: Any]字典)。这些整数保证在-10...-10范围内(包括边界)。在我的模型中,我想将它们存储为Int8。
以下是我将JSON字典转换为模型对象的方法,但我想知道是否有更惯用的方法来确保JSON中的整数实际上适合Int8?
请注意,无论传入的整数的值如何,始终会失败执行以下操作:
这是我将传入的JSON转换为字典的方法。所涉及的JSON嵌套很深,并包含多种不同类型。
以下是我将JSON字典转换为模型对象的方法,但我想知道是否有更惯用的方法来确保JSON中的整数实际上适合Int8?
func move(with dict: JSONDictionary) -> Move? {
if let rowOffset = dict[JSONKeys.rowOffsetKey] as? Int,
let colOffset = dict[JSONKeys.colOffsetKey] as? Int {
if let rowInt8 = Int8(exactly: rowOffset),
let colInt8 = Int8(exactly: colOffset) {
return Move(rowOffset: rowInt8, colOffset: colInt8)
}
else {
print("Error: values out of range: (row: \(rowOffset), col: \(colOffset)")
}
} else {
print("Error: Missing key, either: \(JSONKeys.rowOffsetKey) or \(JSONKeys.colOffsetKey)")
}
return nil
}
请注意,无论传入的整数的值如何,始终会失败执行以下操作:
if let rowOffset = dict[JSONKeys.rowOffsetKey] as? Int8,
let colOffset = dict[JSONKeys.colOffsetKey] as? Int8 {
...
这是我将传入的JSON转换为字典的方法。所涉及的JSON嵌套很深,并包含多种不同类型。
typealias JSONDictionary = [String: Any]
let jsonDict = try JSONSerialization.jsonObject(with: data) as? JSONDictionary
JSONDictionary
吗?只要这些值是来自于Swift(非Int8
)到Obj-C桥接的NSNumber
,那么as? Int8
转换应该可以正常工作 - 尽管对于超出Int8
范围的NSNumber
,额外的位将被截断。 - Hamishas? Int
不起作用(尽管无论如何,你已经说过你不想要截断行为,所以你也不会想使用它),但是这个示例演示出转换应该可以工作。 - HamishAny
强制转换):示例。 - RobertJosephNSNumber
转换为Int8
是SE-0139的一部分,已在Swift 3.0.1中实现。 - OOPer