如何使用alamofire和SwiftyJSON构建对象

时间:2016-01-27 12:58:54

标签: swift uitableview alamofire swifty-json multi-table

我试图创建一个返回包含大量数据的Multi-up表的应用程序,但我想我需要一个完成处理程序。

// object data :

import Foundation

class  RepoSwiftyJSON:NSObject {

   let _userId:String!
   let _title:String!

   init(userid:String , title:String){
      self._userId = userid
      self._title = title  
   }
}
  

TableViewController

import UIKit
import Alamofire
import SwiftyJSON

class TableViewController: UITableViewController {


   var parkData:[JSON] = []
   var aryId = [RepoSwiftyJSON]()

   func getJSONData() {
       let url = "http://jsonplaceholder.typicode.com/posts/"

       Alamofire.request(.GET,url).responseJSON {response in
           guard let data = response.result.value else {
               let error = response.result.error

               let alertController = UIAlertController(title: "Error", message:error?.localizedDescription, preferredStyle: .Alert)
               let okAction = UIAlertAction(title: "Retry", style: .Default, handler: { (alert:UIAlertAction) -> Void in
                      UIApplication.sharedApplication().networkActivityIndicatorVisible = true
                      self.getJSONData()
                      alertController.dismissViewControllerAnimated(true, completion: {})
               })

               alertController.addAction(okAction)
               self.presentViewController(alertController, animated: true, completion: {})
               UIApplication.sharedApplication().networkActivityIndicatorVisible = false
               return
           }

           let json = JSON(data)
           self.parkData = json.array!

           for key in self.parkData{
              let DataArray:RepoSwiftyJSON = RepoSwiftyJSON ()
              let userId = key["userId"].intValue
              let title = key["title"].string
              DataArray._userId = userId
              DataArray._title = title
              self.aryId.append(DataArray)
           }
           self.showJSONData()
      } 
   }

   func showJSONData() {
      //println(parkData)
      tableView.reloadData()
   }

   override func viewDidLoad() {
     super.viewDidLoad()
     getJSONData()
   }


   // MARK: - Table view data source

   override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
      return 1
   }

   override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

       if let numberOfRows: Int = self.aryId.count {
          return numberOfRows
       } else {
          return 0
       }    
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
       let cell = tableView.dequeueReusableCellWithIdentifier("masterCell", forIndexPath: indexPath) 

       let rowData:JSON = aryId[indexPath.row]
       cell.textLabel?.text = rowData._title
       cell.detailTextLabel?.text = String(rowData._userId)
       print(rowData)
       return cell
    }

但是当我运行应用程序时,我收到以下错误:

Missing argument for parameter 'userid' 

在热线电话专线let DataArray:RepoSwiftyJSON = RepoSwiftyJSON ()

Cannot subscript a value of type '[RepoSwiftyJSON]' 

let rowData:JSON = aryId[indexPath.row]

我做错了什么?

1 个答案:

答案 0 :(得分:0)

让我们解决部分问题:

  

第一次错误

根据Apple的说法:

  

在创建该类或结构的实例时,类和结构必须将其所有存储属性设置为适当的初始值。存储的属性不能保留在不确定的状态。

     

您可以在初始化程序中设置存储属性的初始值,或者通过将默认属性值指定为属性定义的一部分。

您尝试使用继承自init的类RepoSwiftyJSON中的默认NSObject方法,建议您不要使用!运算符明确说明编译器,该对象在运行时将具有值。因此,解决问题的一个方法是使用convenience初始化程序,如下所示:

class RepoSwiftyJSON: NSObject {

   let _userId: String
   let _title: String

   init(userid:String , title:String){
      self._userId = userid
      self._title = title
   }

   override convenience init() {
     self.init(userid: "a", title: "b")
   }
}

let DataArray: RepoSwiftyJSON = RepoSwiftyJSON()
DataArray._title // a
DataArray._userId // b

通过上述方式,您覆盖init的默认NSObject并将其标记为convenience以允许调用另一个init(userid:String , title:String)在默认的init方法中。

有很多方法可以解决你的第一个错误,上面只有一个。

  

第二次错误:

如果我们在他的定义中检查变量aryId

var aryId = [RepoSwiftyJSON]()

这是一个RepoSwiftyJSON的数组,在您的后续行中:

let rowData: JSON = aryId[indexPath.row]

您尝试将上述行返回的RepoSwiftyJSON类型的元素分配给另一个JSON类型的元素,但这不正确。

  

修改

您可以使用以下函数创建JSON:

let jsonObject: [AnyObject] = [
   ["name": "John", "age": 21],
   ["name": "Bob", "age": 35],
]

func createJSON(value: AnyObject) -> String {

   let options = NSJSONWritingOptions.PrettyPrinted

   guard NSJSONSerialization.isValidJSONObject(value) else {
      return ""
   }

   do {
       let data = try NSJSONSerialization.dataWithJSONObject(value, options: options)

       if let string = NSString(data: data, encoding: NSUTF8StringEncoding) {
          return string as String
       }
   } catch let error {
       print("\(error)")
   }
   return ""
}


let json = createJSON(jsonObject)

你会看到:

[
  {
    "age" : 21,
    "name" : "John"
  },
  {
    "age" : 35,
    "name" : "Bob"
  }
]

我希望这对你有所帮助。