Swift Передача данных из appDelegate в другой класс
Мне нужно передать переменную из AppDelegate в другой класс, который я создал для хранения глобальных переменных проекта, и я не могу найти способ заставить его работать.
Это код в AppDelegate:
func application(application: UIApplication!, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData!) {
println("Device token is: \(deviceToken)")
//Global Variables Class Instance
let globals:Globals = Globals()
globals.setDeviceToken("test1") //method1 not working
globals.deviceToken = "test2" //method2 not working
}
Это мой класс Globals:
public class Globals {
var deviceToken = String()
init() {
//nothing
}
func setDeviceToken(s:String){
deviceToken = s
}
func getDeviceToken() -> String {
return deviceToken
}
}
Если я попытаюсь напечатать значение, из других файлов проекта, я не могу ничего получить, просто пустую строку.
class ViewController: UIViewController {
//Global Variables Class Instance
let globals:Globals = Globals()
override func viewDidLoad() {
println(globals.getDeviceToken()) //return empty string
println(globals.deviceToken) //return empty string
*** UPDATE:
Тем, кто голосовал по моему вопросу: Большое спасибо. Извините, если я не эксперт Swift (пока) и извините, если я использую stackoverflow, чтобы спросить что-то, чего я не знаю!
Ответы
Ответ 1
Есть несколько шаблонов, которые вы можете использовать для достижения желаемого
-
Вы можете получить доступ к AppDelegate через UIApplication:
let delegate = UIApplication.sharedApplication().delegate as AppDelegate
let deviceToken = delegate.deviceToken
-
Посмотрите на одиночные игры. Быстрый поиск Google для "Swift singleton" позволит вам пройти долгий путь. Первый результат:
class SingletonB {
class var sharedInstance : SingletonB {
struct Static {
static let instance : SingletonB = SingletonB()
}
return Static.instance
}
}
Затем используйте sharedInstance
для создания экземпляра синглтона в любом месте и доступа к тем же переменным.
Первый - быстрый и грязный, поэтому для более серьезных проектов я бы рекомендовал шаблон singleton.
Есть, вероятно, миллион способов сделать это, но это должно заставить вас начать
(Подробнее об этой ссылке, в которой рассматриваются несколько способов реализации синглонов: https://github.com/hpique/SwiftSingleton)
Ответ 2
Я просто решил свою проблему, используя NSUserDefaults
в AppDelegate:
NSUserDefaults.standardUserDefaults().setObject(deviceToken, forKey: "deviceToken")
NSUserDefaults.standardUserDefaults().synchronize()
Из других классов:
NSUserDefaults.standardUserDefaults().objectForKey("deviceToken")
Честно говоря, я не знаю, является ли это хорошим способом сделать это, но он работает
*** ОБНОВЛЕНИЕ: тем, кто голосовал по моему вопросу: Большое спасибо. Извините, если я не эксперт Swift (пока) и извините, если я использую stackoverflow, чтобы спросить что-то, чего я не знаю!