>我正在尝试创建一个返回包含许多数据的 Multiup 表的应用程序,但我认为我在这里需要一个完成处理程序。
// 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]
我做错了什么?
让我们修复零件的问题:
第一个错误:
根据苹果公司的说法:
类和结构必须在创建该类或结构的实例时将其所有存储的属性设置为适当的初始值。存储的属性不能保持不确定状态。
可以在初始值设定项中为存储的属性设置初始值,也可以通过将默认属性值作为属性定义的一部分来分配。
您正在尝试在继承自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"
}
]
我希望这对你有所帮助。