我正在尝试从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-labels
是NSMutableArray
,初始化为nil。执行该行代码后仍然是nill,当然myview.x-labels.count
为零。如果我这样做:
self.my_view!.x-labels = (jsonToDictionary!["x-labels"]) as! NSMutableArray
我收到警告:
将强制向下转换为NSMutableArray作为可选项永远不会产生nil。
然后在运行时崩溃并出现此错误:
无法将'__NSArrayI'(0x110ed5448)类型的值转换为'NSMutableArray'(0x110ed4598)。
当然,“y-values”
也会发生同样的事情这样做的正确方法是什么?
答案 0 :(得分:1)
这是因为你的json!["x-labels"]
被隐含地视为NSArray
,所以你不得不做一个"双力量演员"
// get the converted json
let j = jsonToDictionary(jsonString: dict)
// double cast
let m = (j!["x-labels"] as! NSArray).mutableCopy() as! NSMutableArray
答案 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!)
}