Swift JSON to Dictionary <string:any =“”>。然后将“Any”转换为NSMutableArray

时间:2017-10-25 06:35:21

标签: swift dictionary casting nsmutablearray optional

我正在尝试从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字符串时,返回字典应该在里面计算3个元素,并且确实如此。

然后我可以更改一些变量(Double),直到现在为0,并使用{"min":0.0,"max":1000,"Step":100.0}作为我的字典的“y轴数据”键给它们min max和Step的值。字典它自己。工作正常。

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

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

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

myview.x-labelsNSMutableArray,初始化为nil。执行该行代码后仍然是nill,当然myview.x-labels.count为零。如果我这样做:

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

我收到警告:

  

将强制向下转换为NSMutableArray作为可选项永远不会产生nil。

然后在运行时崩溃并出现此错误:

  

无法将'__NSArrayI'(0x110ed5448)类型的值转换为'NSMutableArray'(0x110ed4598)。

当然,“y-values”

也会发生同样的事情

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

这是因为你的json!["x-labels"]被隐含地视为NSArray,所以你不得不做一个&#34;双力量演员&#34;

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

结果: enter image description here

答案 1 :(得分:0)

我认为,JSONSerialization类转换为Array,然后Swift无法将Array转换为NSMutableArray。你可以这样做(Swift4):

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