老斯威夫特到斯威夫特3

时间:2017-07-26 09:18:55

标签: ios swift swift3

前段时间我创建了一个函数来获取json并将其打印到终端。它工作得很好,但是两年前,当我把它复制到我的最新项目中时,它充满了错误:/我已经解决了大部分问题,但我仍有两个未解决的问题如下:

var arr = JSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as! NSArray

以上一行抱怨电话中有“额外争论”错误。

for var i = 0 ; i < (arr as NSArray).count ; i += 1

上面一行说“在快速3中删除了C-Style for statement”

任何有关解决这两个问题的帮助都会很棒。

完整功能代码如下:

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);

}

8 个答案:

答案 0 :(得分:2)

首先,不要在Swift中使用NSArray ,请使用Swift本机集合类型。

其次,不要从远程网址同步加载数据,请使用URLSession

第三,你不需要循环,只需将接收到的数组分配给arrDict

  • arrDict声明为Swift数组字典

    var arrDict = [[String:Any]]()
    
  • 此代码使用UserDefaultsdo - catch块的正确方法,options jsonObject(with参数可以省略。

    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()
    }
    

答案 1 :(得分:1)

JSONSerialization不再将错误引用作为参数,现在它会抛出异常

var arr : Array<AnyObject> = try JSONSerialization.jsonObject(with: data, options: nil)

至于循环,在Swift 3中完全删除了C风格的循环,所以使用

for object in arr {
    // do stuff
}

for i in 0<..arr.count {
    // do stuff
}

答案 2 :(得分:1)

对于第一个你需要添加的尝试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
}

答案 3 :(得分:0)

对于循环格式:

for i in 0..<arr.count {
    ...code here...
} 

答案 4 :(得分:0)

Swift 3.1

用于JSON序列化尝试如下:

 do {
       var arr = try  JSONSerialization.jsonObject(with: data, options: []) as! NSArray

   } catch {

  }

for Loop语法使用像这样

 for i in 0..<arr.count {
         // Do your stuff       
 }

答案 5 :(得分:0)

这是您在有效的Swift 3语法中的全部功能。

请注意JSONSerialization.jsonObject现在可以投掷。你可以只使用for element in collection语法,你不需要自己指定索引,并且已经从Swift 3中删除了C style for循环,如果你真的需要一个C风格的循环,你必须使用{ {1}}。

在Swift中不鼓励使用stride,如果你真的想使用非显式类型,请使用NSArray,但在可能的情况下使用显式类型。

另外,请确保正确处理可选的展开,并且在使用强制展开/强制转换时,不会出现运行时错误。

Array<Any>

答案 6 :(得分:0)

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样式for循环使用枚举来枚举整个数组。 我不支持在Swift类中使用Objective-C类。不要将阵列分为NSArray或NDDictionary。

答案 7 :(得分:0)

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")
    }
}