【问题标题】:Error on iterating over array swift快速迭代数组时出错
【发布时间】:2018-06-08 05:43:18
【问题描述】:

我正在尝试遍历数组并获取坐标,但它给了我一个错误,我无法访问我的数组。数据通过一个序列传递,如果我打印它表明它正在工作,因此数据可以正确传输,但无法弄清楚为什么我不能遍历数组并提取纬度和经度。

这是控制台的输出。

DeliveryDestinations(NameOrBusiness: Optional("In-N-Out Burger"), FirstLineAddress:可选(“550 Newhall Dr”),SecondLineAddress: 可选(“美国”),CityLineAddress:可选(“圣何塞”), PostcodeLineAddress:可选(“CA 95110”),DistanceToDestination: 可选(9.2807823200000001),纬度:可选(37.350253606833043),长: 可选(-121.92182779312132))

import UIKit
import MapKit
import CoreLocation

class DeliveryLocationsVC: UIViewController {

    @IBOutlet weak var mapView: MKMapView!

    var addressArr = [DeliveryDestinations]()


    override func viewDidLoad() {
        super.viewDidLoad()

        print(addressArr)


navigationItem.title = "Delivery Location"
        // Do any additional setup after loading the view.

        for (theKey, theValue) in addressArr { //<-- error can't access the elements in array
            if (theKey == "Lat") {
                if let coordinates:DeliveryDestinations = theValue {
                print (coordinates)
            }
            print("Item \(theKey): \(theValue)")
            }
        }
    }
}

我的数组来自下面的结构

import Foundation
import MapKit

struct DeliveryDestinations {
    var NameOrBusiness: String?
    var FirstLineAddress: String?
    var SecondLineAddress: String?
    var CityLineAddress: String?
    var PostcodeLineAddress: String?
    var DistanceToDestination: CLLocationDistance?
    var Lat: Double?
    var Long: Double?


    init(NameOrBusiness: String?, FirstLineAddress: String?, SecondLineAddress: String?, CityLineAddress: String?, PostCodeLineAddress: String?, DistanceToDestination: CLLocationDistance?, Lat: Double?, Long: Double? ) {
        self.NameOrBusiness = NameOrBusiness
        self.FirstLineAddress = FirstLineAddress
        self.SecondLineAddress = SecondLineAddress
        self.CityLineAddress = CityLineAddress
        self.PostcodeLineAddress = PostCodeLineAddress
        self.DistanceToDestination = DistanceToDestination
        self.Lat = Lat
        self.Long = Long

    }

}

【问题讨论】:

  • 您希望theKeytheValue 包含什么内容??
  • @luk2302 键将是纬度,值将是相同的坐标,长将是键,值将是坐标。尝试将其放入数组中,以便我可以使用基于此坐标的图钉填充地图。
  • 为什么theKey 应该是“纬度”?这没有任何意义,你有一个数组,在任何地方都找不到“Lat”。
  • @luk2302 不是这个 Lat: Optional(37.350253606833043), Long: Optional(-121.92182779312132)) 键值对?

标签: ios arrays swift3


【解决方案1】:

你有一个数组(而不是字典),所以你需要做的是像这样迭代:

for object in addressArr {
    ...
    // get coordinates from object
    let lat = object.Lat
    let long = object.Long
}

或者,如果您还需要表格行的索引,您可以这样做:

for (i, object) in addressArr.enumerated() {
    ...
    // get coordinates from object
    let lat = object.Lat
    let long = object.Long
    print ("Destination at index \(i) has coordinate: (\(lat), \(long))")
}

我怎么知道它是一个数组?

代码中的符号

 var addressArr = [DeliveryDestinations]()

总是意味着,这是一个DeliveryDestinations对象数组。 当您打印出来时,您会打印出数组中的对象。 在你的情况下,这个对象有一个“像字典一样”的描述,所以 print 函数像这样打印它。

在每个对象中,使用description 函数,您可以指定在对象(或这些对象的数组)上打印时文本的外观

【讨论】:

  • Zedravec 这对我来说非常有效,两种解决方案都很完美。一个问题是我在哪里搞砸了,你怎么知道这是一个数组而不是字典,因为我在这里感到困惑。 Lat: Optional(37.350253606833043), Long: Optional(-121.92182779312132)) 这不是键值对吗?
  • @QuickSilver var addressArr = [DeliveryDestinations](),即一个数组,句号。无论它包含什么以及这些东西如何决定将自己转换为字符串,它都将保持一个数组。
  • @luk2302 感谢您的解释,对不起,我对此很陌生,所以我还在学习。非常感谢你们的帮助。
猜你喜欢
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
相关资源
最近更新 更多