无法快速将对象附加到对象数组

Posted

技术标签:

【中文标题】无法快速将对象附加到对象数组【英文标题】:Can't append object to array of objects in swift 【发布时间】:2015-12-29 00:30:46 【问题描述】:

所以我试图从API 访问数据,这给了我一个包含本地企业的JSON 文件,我正在使用swiftyJSONJSON 文件中获取数据,然后检查它们是否将它们分配给公共变量然后从所述数据创建对象(场地)并不是零。但问题是我无法将对象(场地)附加到我的场地阵列。

这是我的代码:

//File Name: ViewController.swift

import UIKit
import QuadratTouch
import SwiftyJSON
import CoreLocation

class ViewController: UITableViewController

   //Here I create an empty array of Venue Objects  
   var venuesArr = [Venue]()


    override func viewWillAppear(animated: Bool) 

    

    override func viewDidLoad() 
        super.viewDidLoad()

        callAPI()
        // Do any additional setup after loading the view, typically from a nib.
    

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return self.venuesArr.count
    

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell")! as UITableViewCell

        cell.textLabel?.text = self.venuesArr[indexPath.row].name
        return cell
    

    func callAPI()

        let session = Session.sharedSession()
        var parameters = [Parameter.section: "food" ]
        parameters += [Parameter.near:"Massachusetts"]
        parameters += [Parameter.radius:"16093"]
        parameters += [Parameter.limit:"20"]
        let searchTask = session.venues.explore(parameters) 
            (result) -> Void in
            if let response = result.response 
                myJSON = JSON(response)

                let group = myJSON["groups"][0]

                for var i = 0; i < 20;i++ 

                    var items = group["items"][i]
                    var venue = items["venue"]


                    if venue["name"] != nil
                        venueName = venue["name"].string as String!
                    

                    if venue["hours"]["status"] != nil
                        venueHoursStatus = venue["hours"]["status"].string as String!
                    

                    if venue["hours"]["isOpen"] != nil
                        venueIsOpen = Bool(venue["hours"]["isOpen"])
                    

                    let venueRating = venue["rating"].doubleValue

                    if venue["location"]["address"] != nil
                        venueStreetAddress = venue["location"]["address"].string as String!
                    

                    if venue["location"]["city"] != nil
                        venueCity = venue["location"]["city"].string as String!
                    

                    if  venue["location"]["postalCode"] != nil
                        venuePostalCode = venue["location"]["postalCode"].string as String!
                    

                    if venue["location"]["state"] != nil
                        venueState = venue["location"]["state"].string as String!
                    

                    if (venue["hasMenu"] != nil)
                        venueHasMenu = Bool(venue["hasMenu"])
                    

                    if (venue["menu"]["mobileUrl"] != nil)
                        venueMenuURL = venue["menu"]["mobileUrl"].string as String!
                    


                    let venueObject = Venue(name: venueName, hoursStatus: venueHoursStatus, isOpen: venueIsOpen, streetAddress: venueStreetAddress, city: venueCity, state: venueState, postalCode: venuePostalCode, hasMenu: venueHasMenu, menuURL: venueMenuURL, rating: venueRating)

                    //Here is the PROBLEM ----------
                    self.venuesArr.append(venueObject) //--------> This gets called and stores the objects
                     //Here is the PROBLEM ----------

                //end of loop

            
        
        searchTask.start()


    




    // Override point for customization after application launch.


    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    



这是 Venue 的类定义

//File Name: Venue.swift
import Foundation

public class Venue

var name: String
var hoursStatus: String
var hasMenu: Bool
var isOpen: Bool
var streetAddress : String
var city : String
var postalCode : String
var state: String
var menuURL:String
var rating: Double


init(name:String, hoursStatus: String, isOpen: Bool, streetAddress : String, city : String, state: String, postalCode : String, hasMenu: Bool, menuURL:String, rating: Double)

    self.name = name
    self.hoursStatus = hoursStatus
    self.hasMenu = hasMenu
    self.isOpen = isOpen
    self.streetAddress = streetAddress
    self.city = city
    self.postalCode = postalCode
    self.state = state
    self.menuURL = menuURL
    self.rating = rating

     

调试器显示对象已存储,但是当我尝试访问它们时,它们不再存在。请帮忙! 调试器图片

这是我最后一个包含一些变量的文件:

//File Name: Variables.swift
import Foundation
import SwiftyJSON

//JSON that contains API info
public var myJSON:JSON!

//Venue variables
public var venueName: String!
public var venueHoursStatus: String!
public var venueIsOpen: Bool!
public var venueStreetAddress: String!
public var venueCity: String!
public var venuePostalCode: String!
public var venueState:String!
public var venueHasMenu: Bool!
public var venueMenuURL: String!

【问题讨论】:

函数callAPI 不可能编译。变量venueNamevenueHoursStatus 未在任何地方声明(使用varlet)。 对不起!我忘了提到那些是我在另一个文件中声明的公共变量。所以这不是问题 好的。您如何“尝试访问它们”? EX:我有一个名为 variables.swift 的文件,其中包含“public var avenueHasMenu: Bool!”然后我转到我的视图控制器,从 API 获取数据并设置venueHasMenue =(来自API的数据)的值。由于它们是公共变量,因此没有特定的访问方式,对吗? PS:我已将保存变量的文件添加到我的问题中,很抱歉造成混淆。 【参考方案1】:

最终我试图将数组中的数据显示到tableView,然后我意识到我没有在callAPI() 的末尾重新加载tableview,所以我只是插入了self.tableView.reloadData() 然后它工作了!

我认为对象没有被附加到数组中,但它们是。实际的问题是我没有重新加载我的 tableview 的数据源。

【讨论】:

以上是关于无法快速将对象附加到对象数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将对象数组附加到已经存在的数组? [复制]

使用 mongoose 将对象附加到 mongoDB 中的对象数组

将委托附加到数组中的对象

将 JSON 数组对象附加到 formdata

为啥这个函数每次运行时都会将对象两次附加到数组中?

将随机值从数组复制到对象无法获得稳定的结果