![](/img/trans.png)
[英]NSParagraphStyleAttributeName : Conversion from swift 3 to swift 4.2
[英]Swift: Conversion from Swift 2 to Swift 3 Failing
我现在已经来这几天了。
我只是想将我的项目从Swift 2转换为Swift 3,并且已经修复了很多错误。
但是,我到了最后19个,所有这些都是相同的错误。
基本上,我有一个对返回JSON对象的服务器的请求。
该JSON对象在其侧面具有嵌套对象。
我一直在谷歌搜索和阅读多个小时,尝试各种不同的方法,但不幸的是,没有任何效果。
任何帮助表示赞赏。
(注意:有人问我以前的问题,以发布我已经尝试过的内容。
我不会在这里这样做,因为我尝试了许多不同的方法来解决此问题)
错误:类型“ Any”没有下标成员
if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] {
if let data = response["data"] as? NSArray {
for (index, item) in data.enumerated() {
let id = item["id"] as! String
}
}
}
这是我尝试过的一些方法:
if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] {
if let data = response["data"] as? NSArray {
for (index, item):[String:AnyObject] in data.enumerated() {
let id = item["id"] as! String
}
}
}
if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] {
if let data = response["data"] as? NSArray {
for (index, item) in data.enumerated() as? NSArray {
let id = item["id"] as! String
}
}
}
if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] {
if let data = response["data"] as? NSArray {
for item in data as? NSArray {
let id = item["id"] as! String
}
}
}
以上都不解决此问题。 以下是我引用的SOF问题:
任何帮助是极大的赞赏!
您好,您可以尝试以下操作:
if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary {
if let data = response["data"] as? [AnyObject] {
for (index, item) {
if let id = item["id"] as! String{
print(id)
}
}
}
}
要么
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJson = json {
if let data = parseJson["data"] as? [AnyObject] {
for signleArray in data {
if let customObjects = signleArray as? [AnyObject] {
for customObject in customObjects {
let userId = customObject["id"] as! String
}
}
}
}
}
请让我知道它是如何工作的,以便我们找出来:)
好的,因此在获得0ndre_的帮助后,这是我解决问题的方法。 不幸的是,它不能完全解决多维/嵌套对象,因此我不得不修改应用程序正在调用的API。
if let response = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary {
if let data = response["data"] as? [AnyObject] {
for (index, item) in data.enumerated() {
let id = item["id"] as! String
}
}
}
您不应该转换为NSArray
,而应该转换为[AnyObject]
。 在枚举NSArray
,在Swift 3中, id
项类型映射为Any
,而实际上没有下标。 您可以在标准库文档中找到有关Any
vs AnyObject
更多信息,此Swift 3 提案中对此Swift 3更改将id
视为Any
vs AnyObject
进行了说明。
let inputData:Data = "{\"data\": [{\"id\":\"x\"},{\"id\":\"y\"},{\"id\":\"z\"}]}".data(using: .utf8)!
if let response = try JSONSerialization.jsonObject(with: inputData, options: []) as? [String:AnyObject],
let responseData = response["data"] as? [AnyObject]
{
for (index, item) in responseData.enumerated()
{
let id = item["id"] as! String
print(id)
}
}
关于使用第三方库(例如SwiftyJSON)进行JSON解析,您可能不喜欢第三方模块,但是上面的代码将在错误输入时崩溃(如果item没有键“ id”或不是字符串)。 当然,这不是像SwiftyJSON或Freddy这样的库是在Swift中编写健壮的JSON解析代码的唯一方法,但是Cocoa提供的工具肯定不是在使用Swift类型系统,这对程序员没有好处,而且很容易沾沾自喜使用该API输入,解析任务就更加复杂(很可能不会真正使程序崩溃,而应该将其报告为错误)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.