【问题标题】:Local variable won't copy to global variable (swift)局部变量不会复制到全局变量(swift)
【发布时间】:2016-02-25 02:51:33
【问题描述】:

我需要将一个局部变量元组 (sortedMarkers) 从函数 closeMarker() 复制到全局变量 sortedMarkerGlobal 中,但是到目前为止它似乎没有工作。我想在另一个函数中使用 sortedMarkersGlobal 但它的计数为零(空)。

class MapViewController: UIViewController {

@IBOutlet weak var mapView: GMSMapView!

var sortedMarkerGlobal: [(lat: String, long: String)] = []
var nextParkCount: Int = 1 // Used to iterate over sortedMarkers with nextPark IBAction button

let locationManager = CLLocationManager()
var lastLocation: CLLocation? = nil // Create internal value to store location from didUpdateLocation to use in func showDirection()
var isAnimating: Bool = false
var dropDownViewIsDisplayed: Bool = false

override func viewDidLoad() {
    super.viewDidLoad()
 ....
}

func closestMarker(userLat: Double, userLong: Double)-> [(lat: String, long: String)] {

    /*
    var lengthRow = firstRow.count

    while (sortedMarkers.count != lengthRow) { // There are markers that haven't been added to sortedMarkers
    // Haversine formula
    // add nearest marker to sortedMarkers
    // Remove recently added marker from ParseViewControler() type tuple
    // Recurse until all markers are in sortedMarkers
    }
    */

    let markerToTest = ParseViewController()
    let firstRow = markerToTest.returnParse()
    let lat2 = degreesToRadians(userLat) // Nearest lat in radians
    let long2 = degreesToRadians(userLong) // Nearest long in radians

    let R = (6371).doubleValue // Radius of earth in km

    var closestLat: Double? = nil // Used to store the latitude of the closest marker
    var closestLong: Double? = nil // Used to store the longitude of the closest marker

    //
    var indexToDelete: Int = 0 // Used to delete the marker which has been added to sortedMarkers tuple
    let lengthRow = firstRow.count
    var latLongs: (String, String)
    var sortedMarkers: [(lat: String, long: String)] = []

    var dynamicRow = firstRow // Tuple that has markers deleted from it

    while (sortedMarkers.count != lengthRow) { // Store markers from closest to furtherst distance from user
                var shortestDistance = 100.00E100
        for (var i = 0; i < dynamicRow.count; i++) {
                let testMarker = dynamicRow[i]
                let testLat = (testMarker.lat as NSString)
                let testLong = (testMarker.long as NSString)
                let doubleLat = Double(testLat as String)
                let doubleLong = Double(testLong as String)
                let lat1 = degreesToRadians(doubleLat!)
                let long1 = degreesToRadians(doubleLong!)

                let dLat = lat2 - lat1
                let dLong = long2 - long1

                let a = ((sin((dLat)/2)) * (sin((dLat)/2))) + (cos(lat1)*cos(lat2)*((sin((dLong)/2)) * (sin((dLong)/2))))
                let b = sqrt(a)
                let d = (2*R) * (asin(b)) // Haversine formula
                if (d < shortestDistance) {
                    closestLat = (doubleLat)
                    closestLong = (doubleLong)
                    shortestDistance = d
                    indexToDelete = i// Keep updating index of closest marker to later be removed
                }
            }
        latLongs = (String(closestLat!), String(closestLong!)) // Each time for loop will find closest marker ~ NOT WORKING ~
        sortedMarkers.append(latLongs)
        dynamicRow.removeAtIndex(indexToDelete) // Remove marker that has just been added
    }
    sortedMarkerGlobal = sortedMarkers
    return sortedMarkers
}

【问题讨论】:

  • 请注意,尽管有它的名字,sortedMarkerGlobal不是一个全球性的。 ——除此之外,你调试了吗?本地sortedMarkers 输出是否正确?如果是这样,你有什么证据证明sortedMarkerGlobal 不是?
  • 您应该使用两个功能来让您的生活更轻松:排序和 CLLocationDistance。使用这些,您可以使用大约一行代码对数组进行排序。

标签: ios swift


【解决方案1】:

sortedMarkerGlobal 不是全局变量。目前它是一个实例变量,就像您定义的任何其他变量(locationManager、lastLocation、isAnimating 等)一样。

如果你希望它是一个全局变量,你应该在你的类MapViewController之外定义它。

另一种选择是将其定义为 MapViewController 的类变量:

class MapViewController: UIViewController {
    static var sortedMarkerGlobal: [(lat: String, long: String)] = []
}

【讨论】:

  • 感谢在 MapViewController 之外定义它的人 :)
【解决方案2】:

我试着在操场上测试你的代码,它对我有用

import UIKit
class Test {
var global:[(lat: String, long: String)] = []
func test1() {
    var sortedMarkers: [(lat: String, long: String)] = []
    var latLongs: (String, String)
    latLongs = ("123", "123")
    sortedMarkers.append(latLongs)
    global = sortedMarkers
 }
}
let test:Test = Test()    
test.test1();
print("global \(test.global)")

结果是 global [("123", "123")] 所以我想它也应该对你有用,问题可能出在其他地方。

【讨论】:

    【解决方案3】:

    我建议您只使用闭包而不是保存到全局变量。这使您可以传入参数并根据该参数返回结果。您可以将该结果保存在调用它的函数中,然后从那里做任何您想做的事情。

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 2019-06-05
      • 2013-01-06
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多