Singleton类变量在初始化函数外返回nil

时间:2017-05-22 19:27:18

标签: ios swift xcode swift3

我正在使用XCode 8学习Swift,并且一直在开发这个简单的天气应用程序。该应用程序从openweather.org公共API获取当前天气和未来10天天气预报的数据。

在从具有静态纬度和经度的JSON格式的openweather API中提取数据并将其显示在UI(包含用于当前天气的UIView和用于10的预测数据的UITableView)方面,一切正常。天)。该应用程序看起来像 此 -

enter image description here

现在,我正在实施CoreLocation协议,使用设备GPS获取纬度和经度(而不是硬编码坐标),然后将lat / long存储到单个类变量中。单身人士课程如下所示 -

import CoreLocation

class Location{
    static var sharedInstance = Location()
    private init(){}
    var latitude: Double!
    var longitude: Double!        
}

现在在我的主ViewController中,我有一个函数初始化LocationManager以获取设备位置(lat / long),然后将其存储到单例类变量latitude和{{1}中}。该函数从longitude调用。主视图控制器看起来像这样 -

ViewdidAppear

现在我有一个常量文件,它包含应用程序的某些全局常量,例如openweather API URL等。我想在这里使用单例类变量import UIKit import CoreLocation class WeatherVC: UIViewController, UITableViewDelegate, UITableViewDataSource, CLLocationManagerDelegate { .... .... //IBOutlets etc. //Some vars etc. override func viewDidLoad() { super.viewDidLoad() locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.requestWhenInUseAuthorization() locationManager.startMonitoringSignificantLocationChanges() ......//a few more lines of code here print(Location.sharedInstance.latitude,Location.sharedInstance.longitude)// this prints nil, nil } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) locationAuthStatus() } func locationAuthStatus(){ if CLLocationManager.authorizationStatus() == .authorizedWhenInUse{ currentLocation = locationManager.location Location.sharedInstance.latitude = currentLocation.coordinate.latitude Location.sharedInstance.longitude = currentLocation.coordinate.longitude print(Location.sharedInstance.latitude,Location.sharedInstance.longitude) //this prints the correct values }else{ locationManager.requestWhenInUseAuthorization() locationAuthStatus() } } } Location.sharedInstance.latitude。常量文件有一个变量,可以构造2个API URL,如此 -

Location.sharedInstance.longitude

但是,let CURRENT_WEATHER_URL = "\(BASE_URL)\(LATITUDE)\(Location.sharedInstance.latitude)\(LONGITUDE)\(Location.sharedInstance.longitude)\(APP_ID)\(API_KEY)" let FORECAST_WEATHER_URL = "\(FORECAST_URL)\(LATITUDE)\(Location.sharedInstance.latitude)\(LONGITUDE)\(Location.sharedInstance.longitude)\(FORECAST_CNT)\(APP_ID)\(API_KEY)" Location.sharedInstance.latitude总是在Location.sharedInstance.longitude函数之外返回nil,因此locationAuthStatus()和{{1}中的纬度/经度值}}显示为CURRENT_WEATHER_URL,因此API调用失败。 FORECAST_WEATHER_URL函数中有一个print语句,它正确打印nillocationAuthStatus()值,但不知何故,这些值拒绝传播到应用程序的其余部分(在其他类中)。我尝试从项目中的所有其他类中打印这些类,并且所有类都返回Location.sharedInstance.latitude

我仍然在学习更多关于Singleton类和Swift的知识,但是对于我做错了什么的一些见解将会非常感激。

0 个答案:

没有答案