[英]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.