如何使用 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"
}
]
希望对您有所帮助。
我正在尝试创建一个 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"
}
]
希望对您有所帮助。