【发布时间】:2017-06-14 18:15:24
【问题描述】:
我通过 api json 响应(我将其转换为 [String: Any] 字典)接收到一组整数。这些整数保证在 10...-10 范围内(含)。在我的模型中,我想将这些存储为Int8。
这就是我将 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的?如果NSNumbers 的值不是源自 Swift(非Int8)到 Obj-C 桥,则演员as? Int8应该可以正常工作 - 尽管NSNumbers 的值超出了 @ 的范围987654335@,多余的位将被截断。 -
已更新以回答您的问题。
-
嗯,奇怪的是
as? Int在你的情况下不起作用(尽管在任何情况下,你已经声明你不想截断行为,所以你不想使用无论如何)-但this example demonstrates演员应该工作。 -
实际上,您的示例也失败了(没有
Any演员表):example -
从
NSNumber到Int8的转换是SE-0139 的一部分,并在Swift 3.0.1 中实现。
标签: json swift integer type-conversion