[英]Old Swift to Swift 3
不久前,我創建了一個函數來獲取json並將其打印到終端。 它運行良好,但是是兩年前的,所以當我將其復制到我的最新項目中時,它充滿了錯誤:/我已經解決了大多數錯誤,但是仍然存在兩個突出的問題,如下所示:
var arr = JSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as! NSArray
上一行抱怨呼叫中存在“額外參數錯誤”。
for var i = 0 ; i < (arr as NSArray).count ; i += 1
上面的代碼行說:“ C-Style for statement已在迅速3中刪除”
解決這兩個問題的任何幫助都會很棒。
完整功能代碼如下:
func jsonParsing()
{
let prefs:UserDefaults = UserDefaults.standard
var webaddress = prefs.value(forKey: "WEBADDRESS") as! String
let url2 = URL(string: webaddress + "straightred/jsonfixture/")
let data = try? Data(contentsOf: url2!)
var arr = JSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as! NSArray
arrDict = []
for var i = 0 ; i < (arr as NSArray).count ; i += 1
{
arrDict.addObject((arr as NSArray) .objectAtIndex(i))
}
print(arrDict);
}
首先, 不要在Swift中使用NSArray
,而應使用Swift本機集合類型。
其次, 不要從遠程URL同步加載數據 ,請使用URLSession
第三,您不需要循環,只需將接收到的數組分配給arrDict
將arrDict
聲明為Swift的字典數組
var arrDict = [[String:Any]]()
這段代碼使用UserDefaults
的正確方法和do - catch
塊,以及jsonObject(with
的options
參數可以省略。
func jsonParsing() { let prefs = UserDefaults.standard let webaddress = prefs.string(forKey: "WEBADDRESS")! let url2 = URL(string: webaddress + "straightred/jsonfixture/")! let task = URLSession.shared.dataTask(with: url2) { [unowned self] (data, response, error) in if let error = error { print(error) return } do { let arr = try JSONSerialization.jsonObject(with:data!) as! [[String:Any]] self.arrDict = arr print(self.arrDict) } catch { print(error) } } task.resume() }
JSONSerialization
不再將錯誤引用作為參數,現在會引發異常
var arr : Array<AnyObject> = try JSONSerialization.jsonObject(with: data, options: nil)
至於循環,C型循環在Swift 3中已完全刪除,因此請使用
for object in arr {
// do stuff
}
要么
for i in 0<..arr.count {
// do stuff
}
對於第一個,您需要添加do try catch
do {
var arr : Array<AnyObject> = JSONSerialization.jsonObject(with: data!)) as! NSArray
// do your works
} catch {
print("Got error: \(error)")
}
對於第二個,您需要通過以下方式進行for循環
for i in 0..<arr.count {
//do your stuff here
}
對於循環格式:
for i in 0..<arr.count {
...code here...
}
斯威夫特3.1
對於JSON序列化,請嘗試如下操作:
do {
var arr = try JSONSerialization.jsonObject(with: data, options: []) as! NSArray
} catch {
}
for循環語法使用像這樣
for i in 0..<arr.count {
// Do your stuff
}
這是有效的Swift 3語法的全部功能。
請注意, JSONSerialization.jsonObject
現在可以拋出。 您可以for element in collection
語法中使用for element in collection
無需自己指定索引,並且Swift 3中的C樣式已從Swift 3中刪除,如果您確實需要C樣式的for循環,則必須使用stride
。
在Swift中不建議使用NSArray
,如果您確實想使用非顯式類型,請使用Array<Any>
,但在可能的情況下,請使用顯式類型。
還要確保正確處理可選的展開,並且在使用強制展開/強制轉換時,不會出現運行時錯誤。
func jsonParsing(){
let prefs:UserDefaults = UserDefaults.standard
var webaddress = prefs.value(forKey: "WEBADDRESS") as! String
let url2 = URL(string: webaddress + "straightred/jsonfixture/")
let data = try? Data(contentsOf: url2!)
var arr = (try? JSONSerialization.jsonObject(with: data!)) as! NSArray
var arrDict = [Any]()
for current in arr {
arrDict.append(current)
}
print(arrDict)
}
func jsonParsing()
{
let prefs:UserDefaults = UserDefaults.standard
var webaddress = prefs.value(forKey: "WEBADDRESS") as! String
let url2 = URL(string: webaddress + "straightred/jsonfixture/")
let data = try? Data(contentsOf: url2!)
var arr = try JSONSerialization.jsonObject(with: data!) as! [Any] // if Array of any type, if array of dictionaries cast it to [[String:Any]]
arrDict = []
for value in arr { // instead of iterating over your array you can simply copy it to arrDict. I added for loop for your refernce.
arrDict.addObject(name)
}
print(arrDict);
}
JSON序列化方法已更新。 不建議使用C樣式的循環,而應使用枚舉來枚舉整個數組。 我不支持在您的Swift類中使用Objective-C類。 不要將數組強制轉換為NSArray或NDDictionary。
In Swift 3, try this code for son parsing
func jsonParsing()(){
//check if strUrl not nill then enter this block
if strUrl != nil{
var request = URLRequest(url: URL(string: strUrl!)!)//get requet from urlRequest
let session = URLSession.shared //creat session object
request.httpMethod = "GET" // set http method
//get data from url using session.datatask methos
session.dataTask(with: request) {data, response, error in
if error != nil{
print(error!.localizedDescription)
return
}
do{
//get json result and store in dictionary
let dicJsonResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
let arrData = dicJsonResult["data"] as! NSArray // set friend list in array
self.tblView.reloadData()
}
catch
{
print(error.localizedDescription)
}
}.resume()
}else{
print("No more friends")
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.