0

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

表视图控制器

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]

我做错了什么?

4

1 回答 1

0

让我们解决零件的问题:

第一个错误

据苹果称:

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

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

您正在尝试使用继承自init的类中的默认方法,不建议使用运算符明确告诉编译器该对象将在运行时具有值。因此,解决您的问题的一种选择是使用初始化程序,如下所示:RepoSwiftyJSONNSObject!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"
  }
]

我希望这对你有帮助。

于 2016-01-27T21:06:08.760 回答