ios - 按位置打印数组显示为空

标签 ios arrays json swift cllocation

目标是这样的:

  • 计算数组中每一项的纬度和经度
  • 将纬度和经度附加到数组
  • 以最大距离打印数组中的所有项目。

以下是我提取数据的方式:

import Foundation
import SwiftyJSON

class restaurant {

    //Json
     var id: Int!
     var name: String!
     var address: String!
     var city: String!
     var logo: String!
     var state: String!
     var postKey: String!


    //Second
    var ids: Int!
    var names: String!
    var aAddress: String!
    var citys: String!
    var logos: String!
    var states: String!

    var distance : Double = 0

    //Importing data from server. Bring moto. Make sure you are able to get details in postman prior to adding any other variables
    init(json: JSON) {
        self.id = json["id"].int
        self.name = json["dispensary_name"].string
        self.address = json["street_address"].string
        self.logo = json["logo"].string
        self.city = json["city"].string
        self.state = json["state"].string
    }

    init(postKey: String, postData: Dictionary<String, AnyObject>) {
        self.postKey = postKey

//        self.ids = postData[self.id]?.int
        self.names = postData[self.name]?.string
        self.aAddress = postData[self.address]?.string
        self.citys = postData[self.city]?.string
        self.logos = postData[self.logo]?.string
        self.states = postData[self.state]?.string
    }
}

这是我的数组: //加载餐厅列表。

func loadRestaurants() {
    Helpers.showActivityIndicator(activityIndicator, view)

    APIManager.shared.getRestaurants { (json) in
        if json != nil {
            self.restaurants = []
                //Adds all items into the array list dist then goes through them all.
            if let listDis = json["restaurant"].array {
                for item in listDis {

                    let address = item["street_address"].string! + ", " + item["city"].string! + ", " + item["state"].string!

                    self.getLocation(address, { (dis) in
                                        self.disLocation = dis
                    })

                    //snap = item, snapshot = listdict

                    if let snapValue = item.array as? [String:AnyObject],
                       let venueLat = self.disLocation?.coordinate.latitude,
                       let venueLong = self.disLocation?.coordinate.longitude {
                        print("snapValue ,", snapValue)
                        let distance = self.calculateDistance(userlat: self.userLatt, userLon: self.userLonn, venueLat: venueLat, venueLon: venueLong)

                        if distance <= 15 {
                            let key = item.string
                            let restaurant = Restaurant(postKey: key!, postData: snapValue)
                            restaurant.distance = distance
                            self.restaurants.append(restaurant)
                            print("restaurant :", snapValue)
                        }
                    }
                }

                if self.restaurants.count == 0 {
                    let alert = UIAlertController(title: "Oh No!!!", message: "We Only Deliver To New Jersey", preferredStyle: UIAlertControllerStyle.alert)
                    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
                         }))
                    self.present(alert, animated: true, completion: nil)
                }
                self.restaurants.sort {                                
                    $0.distance < $1.distance
                }
            }
            self.restaurants.reloadData()
            Helpers.hideActivityIndicator(self.activityIndicator)
        }
    }
}

我不确定我应该在这里做什么。任何建议都会有所帮助。

项目输出:

"state" : "New Jersey",
  "city" : "Highland Park",
  "id" : 3,
  "dispensary_name" : "Down South Taste",
  "street_address" : "4422 knotwood ct",
  "zip_Code" : 56430,
  "phone" : "444-334-0888",

最佳答案

您对 Restaurant 对象(第二个)使用的 init 方法显然是错误的,并且会导致运行时崩溃,因为您正在解包 nil 值。

self.names = postData[self.name]?.string 

name 在这里是 nil 但声明为

var name: String!

我真的不明白你在阅读字典时使用属性作为键而不是字符串常量试图实现什么?

也许做类似的事情

let nameKey = "dispensary_name"
...

self.names = postData[nameKey]?.string 

如果我理解正确,你的程序不会崩溃,这告诉我们从未调用构造函数。我的猜测是周围 if 语句中的条件失败,条件的第一部分在您调用 json 项上的 .array 并将结果类型转换为字典时看起来是错误的

if let snapValue = item.array as? [String:AnyObject], ...

.array. 在这里看起来不对,虽然我不知道你的 json 格式,但你之前将 item 属性作为字典访问,不是吗 item 那是你的字典。

希望这能帮助您前进。

关于ios - 按位置打印数组显示为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50418022/

相关文章:

javascript - 返回一个元素在特定位置的数组

javascript - 如何通过 HTMLService (Google App Scripts) 将电子表格数据放入客户端数组

ios - 如何在 iOS 中解析从 HTTP POST 输出的 JSON 字符串

javascript - 如何将 JSP 中的结果集传递给 Javascript

ios - 未调用 iCloud 键值存储更改 (NSUbiquitousKeyValueStoreDidChangeExternallyNotification)

java - 如何提示用户直到程序得到有效答案,如何做到N次?

iphone - AppCode 上的当前位置模拟

json - NoSQL 是否适合存储用户数据?

ios - 将图层属性从 UIView 覆盖到子类 UIView

ios - Monotouch-启用Guard Malloc