![](/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.