SwiftyJSON - 表达式不明确
SwiftyJSON - expression is ambiguous
我尝试使用 SwiftyJSON 解析 JSON,但我遇到了问题。
我使用 here
中的教程
这是我的代码
var JSONStorage : [Article?]?
var objects = [[String: String]]()
override func viewDidLoad() {
super.viewDidLoad()
let number = arc4random_uniform(1000)
let urlString = "http://78.27.190.58:3200/api/get_article/17?\(number)"
if let url = NSURL(string: urlString) {
if let data = try? NSData(contentsOfURL: url, options: []) {
let json = JSON(data: data)
for element in json["article"].arrayValue {
let id = Int(element["id"].stringValue)
let title = element["title"].stringValue
let subtitle = element["subtitle"].stringValue
let body = element["body"].stringValue
let img = element["images"]["main"].rawValue
let obj = ["id": id, "title": title, "subtitle": subtitle, "body": body, "img": img]
objects.append(obj)
}
}
}
}
这是我得到的错误
我做错了什么?
swift中的数组或字典不能是异构的。如果您查看您的代码,您希望将一个 int 和四个字符串作为 obj 的值。
这会起作用:
for element in json["article"].arrayValue {
let id = element["id"].stringValue // must be string to put it in obj
let title = element["title"].stringValue
let subtitle = element["subtitle"].stringValue
let body = element["body"].stringValue
let img = element["images"]["main"].rawValue
let obj: [String: String] = ["id": id, "title": title, "subtitle": subtitle, "body": body, "img": img]
objects.append(obj)
}
您的 objects
是 [[String:String]]
类型,一个字典数组。这些字典的键类型为 String
,值类型为 String
。
但是你向这个数组添加了一个包含不同类型值的字典:String
s 和你的 .stringValue
对象,以及一个 .rawValue
必须是 NSData 类型的我认为.
一个解决方案可能是键入字典 [String:AnyObject]
(以及数组 [[String:AnyObject]]
)并在检索值时在另一端进行类型转换。
顺便说一句,编译器说 "expression is ambiguous" 因为它无法推断数组的类型(现在我们知道原因了)。
请注意,解析 JSON 时效率不是最高的。更好的方法是从您的数据创建对象:类 或结构。例如,你可以有一个结构 Article
来保存每个 element
值,就像你在另一个问题中展示的那样。
我尝试使用 SwiftyJSON 解析 JSON,但我遇到了问题。
我使用 here
中的教程这是我的代码
var JSONStorage : [Article?]?
var objects = [[String: String]]()
override func viewDidLoad() {
super.viewDidLoad()
let number = arc4random_uniform(1000)
let urlString = "http://78.27.190.58:3200/api/get_article/17?\(number)"
if let url = NSURL(string: urlString) {
if let data = try? NSData(contentsOfURL: url, options: []) {
let json = JSON(data: data)
for element in json["article"].arrayValue {
let id = Int(element["id"].stringValue)
let title = element["title"].stringValue
let subtitle = element["subtitle"].stringValue
let body = element["body"].stringValue
let img = element["images"]["main"].rawValue
let obj = ["id": id, "title": title, "subtitle": subtitle, "body": body, "img": img]
objects.append(obj)
}
}
}
}
这是我得到的错误
我做错了什么?
swift中的数组或字典不能是异构的。如果您查看您的代码,您希望将一个 int 和四个字符串作为 obj 的值。
这会起作用:
for element in json["article"].arrayValue {
let id = element["id"].stringValue // must be string to put it in obj
let title = element["title"].stringValue
let subtitle = element["subtitle"].stringValue
let body = element["body"].stringValue
let img = element["images"]["main"].rawValue
let obj: [String: String] = ["id": id, "title": title, "subtitle": subtitle, "body": body, "img": img]
objects.append(obj)
}
您的 objects
是 [[String:String]]
类型,一个字典数组。这些字典的键类型为 String
,值类型为 String
。
但是你向这个数组添加了一个包含不同类型值的字典:String
s 和你的 .stringValue
对象,以及一个 .rawValue
必须是 NSData 类型的我认为.
一个解决方案可能是键入字典 [String:AnyObject]
(以及数组 [[String:AnyObject]]
)并在检索值时在另一端进行类型转换。
顺便说一句,编译器说 "expression is ambiguous" 因为它无法推断数组的类型(现在我们知道原因了)。
请注意,解析 JSON 时效率不是最高的。更好的方法是从您的数据创建对象:类 或结构。例如,你可以有一个结构 Article
来保存每个 element
值,就像你在另一个问题中展示的那样。