Подтвердить что ты не робот

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, чтобы спросить что-то, чего я не знаю!

4b9b3361

Ответ 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, чтобы спросить что-то, чего я не знаю!