Swift JSON 到词典<String: Any>。然后将 "Any" 转换为 NSMutableArray

Swift JSON to Dictionary<String: Any>. Then cast "Any" as NSMutableArray

我正在尝试从 JSON 字符串中读取数据并用其数据绘制图形:

{"y-axis-data":{"min":0.0,"max":1000,"Step":100.0},"x-labels":[1994,2000,2005],"y-values":[20,305,143]}

我写了一个函数来从字符串创建字典:

func jsonToDictionary(jsonString: String) -> [String: Any]? {

    if let jsonData: Data = jsonString.data(using: String.Encoding.utf8) {

        do {
            return try (JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any])!
        } catch {
            some bla bla 
        }
    }
    return nil
}

当我传递我的 JSON 字符串时,return 字典应该计算里面的 3 个元素,确实如此。

然后我可以更改一些变量 (Double),这些变量直到现在都是 0,并使用 {"min":0.0,"max":1000,"Step":100.0} 作为字典本身。工作正常。

我在尝试初始化其他属性时遇到了麻烦:

self.my_view!.x-labels = (jsonToDictionary!["x-labels"])  as? NSMutableArray

my_view 已经初始化为 UIViewCustomClass(frame: someFrame)

myview.x-labels 是一个 NSMutableArray 并且它被初始化为 nil。执行完那行代码还是nil,当然myview.x-labels.count就是nil了。如果我这样做:

self.my_view!.x-labels = (jsonToDictionary!["x-labels"])  as! NSMutableArray

我收到警告:

Treating a forced downcast to NSMutableArray as optional will never produce nil.

然后它在运行时崩溃并出现以下错误:

Could not cast value of type '__NSArrayI' (0x110ed5448) to 'NSMutableArray' (0x110ed4598).

当然,"y-values"

也会发生完全相同的事情

正确的做法是什么?

我觉得,JSONSerializationclass转成Array,然后Swift不能把Array转成NSMutableArray。你可以这样做 (Swift4):

let array = (jsonToDictionary!["x-labels"]) as? [Int]
if array != nil {
   self.my_view!.x-labels = NSMutableArray(array: array!)
}

这是因为你的 json!["x-labels"] 被隐含地视为 NSArray,所以你不得不做一个 "double-force-cast"

// get the converted json
let j = jsonToDictionary(jsonString: dict)
// double cast
let m = (j!["x-labels"] as! NSArray).mutableCopy() as! NSMutableArray

结果: