【问题标题】:how build objects with alamofire and SwiftyJSON如何使用 alamofire 和 SwiftyJSON 构建对象
【发布时间】:2016-01-27 12:58:53
【问题描述】:

我正在尝试创建一个返回包含许多数据的 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]一行

我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    让我们解决零件的问题:

    第一个错误

    根据苹果:

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

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

    您正在尝试使用继承自 NSObject 的类 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
    

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

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

    第二个错误:

    如果我们检查他定义中的变量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"
      }
    ]
    

    希望对你有所帮助。

    【讨论】:

    • 如何返回 JSON 类型的??
    • @phantom 查看更新的答案以了解如何创建 JSON。
    猜你喜欢
    • 2018-03-01
    • 2018-10-06
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2023-03-18
    相关资源
    最近更新 更多