簡體   English   中英

老雨燕到雨燕3

[英]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(withoptions參數可以省略。

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM