Function 在swift中访问函数外部的变量

Function 在swift中访问函数外部的变量,function,swift,global-variables,cllocation,cllocationcoordinate2d,Function,Swift,Global Variables,Cllocation,Cllocationcoordinate2d,我从中获取坐标,但我希望能够在位置管理器功能之外使用它们。有可能使它们成为实例变量吗?如果是这样,有人能给我一些例子代码吗?在下面的代码中,我在func内打印,它可以工作,但我希望能够在func外打印,或者使用坐标。也许作为一个全局变量?我该如何编写代码?我从文件上看不太清楚 import UIKit import CoreLocation import MapKit class ViewController: UIViewController, CLLocationManagerDelega

我从中获取坐标,但我希望能够在位置管理器功能之外使用它们。有可能使它们成为实例变量吗?如果是这样,有人能给我一些例子代码吗?在下面的代码中,我在func内打印,它可以工作,但我希望能够在func外打印,或者使用坐标。也许作为一个全局变量?我该如何编写代码?我从文件上看不太清楚

import UIKit
import CoreLocation
import MapKit

class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate {

  var locationManager: CLLocationManager!
  var seenError : Bool = false
  var theSpan: MKCoordinateSpan = MKCoordinateSpanMake(0.1, 0.1)
  var locationStatus : NSString = "Not Started"

  var initialLoc:Int = 1

  override func viewDidLoad() {
    super.viewDidLoad()

    locationManager = CLLocationManager()
    locationManager.requestAlwaysAuthorization()
    locationManager.delegate = self
    var initialLoc:Int = 1
    // Do any additional setup after loading the view, typically from a nib.
  }

  @IBOutlet weak var Map: MKMapView!
  @IBAction func Here(sender: AnyObject) {       
    initLocationManager()
  }

  func initLocationManager() {
    seenError = false
    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.startUpdatingLocation()
    Map.showsUserLocation = true
  }

  func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {

    var locationArray = locations as NSArray
    var locationObj = locationArray.lastObject as CLLocation
    var coord = locationObj.coordinate
    if initialLoc == 1 {
        var Region:MKCoordinateRegion = MKCoordinateRegionMake(coord, theSpan)
        self.Map.setRegion(Region, animated:true)
        initialLoc = 0
    }
    println(coord.latitude)
    println(coord.longitude)
  }

  // Location Manager Delegate stuff
  // If failed
  func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
    locationManager.stopUpdatingLocation()
    if (error) {
        if (seenError == false) {
            seenError = true
            print(error)
        }
     }
  }

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

如果我理解正确的话,我认为最好的选择是将其作为一个实例变量,正如您所说的。这可以通过在函数外部声明它,并在类的顶部声明其他实例变量(星号用于显示我添加的内容):

问号将变量声明为,因此不必立即为其赋值
然后,将
locationObj.coordinate
值分配给
locationManager
函数中的
coord
,但是,由于您已经将函数外部的
coord
变量声明为实例变量,因此可以删除
var coord=locationObj.coordinate
中的
var

    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
    
        var locationArray = locations as NSArray
        var locationObj = locationArray.lastObject as CLLocation

        //Assign value to coord variable
     ***coord = locationObj.coordinate***

        if initialLoc == 1 {
            var Region:MKCoordinateRegion = MKCoordinateRegionMake(coord, theSpan)
            self.Map.setRegion(Region, animated:true)
            initialLoc = 0
        }
然后,除了类中的任何其他函数(如全局变量)之外,您还可以在函数的其余部分正常使用该变量
祝你好运

另外,请学习如何做好这一点,因为在处理函数和变量时,在将位置读入局部变量,而不是将其读入实例变量时,始终使用此方法。因此,不是:

var locationObj = locationArray.lastObject as CLLocation
使用

申报

var locationObj : CLLocation?

视图控制器中
。然后您可以使用“点”符号访问
locationObj

谢谢!这工作做得很好!对于阅读本文的任何其他人来说,当使用此方法时,我认为您还需要在使用变量时隐式地展开变量,否则会出现错误。至少这修复了我的错误符号,例如键入println(coord!.latitude),而不是println(coord.latitude)!为了确保将来的参考,我将如何使变量可以从另一个文件访问?@Sholto不客气!至于使
ViewController
的属性可从另一个文件访问,您需要在该文件中创建该类的实例,该实例将继承原始
ViewController
类的所有实例变量和方法。这是这样完成的:
class TestClass{
var instanceOfClass=ViewController()
。然后您可以使用点符号访问该实例的属性,如下所示:
instanceOfClass.coord
从类的实例中检索变量
coord
)@Sholto,隐式展开也很好!正如您所说,这是包装可选变量所必需的。但是,如果您不想这样做,可以通过删除
并将其替换为
,将其声明为隐式展开可选变量。这样,在使用变量be时就不必使用
因为它已经在声明中展开了,我遇到了一个问题,swift至少目前说viewcontrollers不能用just()构造。我环顾四周,发现一个似乎有效的方法是var instance1=self.storyboard.InstanceViewControllerWithiIdentifier(“LoginPage”)ViewController2的问题是,当我试图从这个实例内部访问变量时,它们的结果是nil(或者至少看起来没有值?),有什么建议吗?谢谢!另一种方法对我来说更直观,至少在处理单个变量时是如此,但这有助于!快速提问,我如何从另一个文件访问信息?比如另一个viewController?也许你可以这样声明:public var locationObj:CLLocation?只需注意:CLLocationManager already有一个属性位置,您可以在委托方法之外访问它,但在使用之前请确保它不是nil:
如果(locationManager.location!=nil){//使用locationManager.location.coordinate…}
self.locationObj = locationArray.lastObject as CLLocation
var locationObj : CLLocation?