如何使用 alamofire 和 SwiftyJSON 构建对象

how build objects with alamofire and SwiftyJSON

我正在尝试创建一个 returns 多联 table 具有许多数据的应用程序,但我想我需要一个完成处理程序。

// 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]

我做错了什么?

让我们解决部分问题:

First Error:

根据 Apple 的说法:

Classes and structures must set all of their stored properties to an appropriate initial value by the time an instance of that class or structure is created. Stored properties cannot be left in an indeterminate state.

You can set an initial value for a stored property within an initializer, or by assigning a default property value as part of the property’s definition.

您正在尝试使用继承自 NSObject 的 class RepoSwiftyJSON 中的默认 init 方法,不建议使用 !运算符明确告诉编译器该对象将在运行时具有值。因此,解决您的问题的一种选择是使用 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

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

有很多方法可以解决您的第一个错误,以上只是其中一种。

Second Error:

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

var aryId = [RepoSwiftyJSON]()

它是一个 RepoSwiftyJSON 的数组,在你的下一行中:

let rowData: JSON = aryId[indexPath.row]

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

EDIT:

您可以使用以下函数创建 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"
  }
]

希望对您有所帮助。