AppDelegateから、プロジェクトのグローバル変数を保持するために作成した別のクラスに変数を渡す必要がありますが、それを機能させる方法を見つけることができません。
これはAppDelegateのコードです:
func application(application: UIApplication!, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData!) {
println("Device's token is: \(deviceToken)")
//Global Variables Class Instance
let globals:Globals = Globals()
globals.setDeviceToken("test1") //method1 not working
globals.deviceToken = "test2" //method2 not working
}
これは私のグローバルクラスです。
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
あなたが望むものを達成するために使用できるいくつかのパターンがあります
UIApplicationを介してAppDelegateにアクセスできます。
let delegate = UIApplication.sharedApplication().delegate as AppDelegate
let deviceToken = delegate.deviceToken
シングルトンを調べてください。 「Swiftsingleton」をグーグルですばやく検索すると、長い道のりがわかります。最初の結果:
class SingletonB {
class var sharedInstance : SingletonB {
struct Static {
static let instance : SingletonB = SingletonB()
}
return Static.instance
}
}
次に、sharedInstance
を使用してシングルトンを任意の場所にインスタンス化し、同じ変数にアクセスします。
最初のものは速くて汚いので、より深刻なプロジェクトにはシングルトンパターンをお勧めします。
これを行うにはおそらく百万の方法がありますが、これで始めることができます
(シングルトンを実装するいくつかの方法を探るこのリンクで詳細をご覧ください: https://github.com/hpique/SwiftSingleton )
NSUserDefaultsを使用して問題を簡単に解決しました
appDelegate内:
NSUserDefaults.standardUserDefaults().setObject(deviceToken, forKey: "deviceToken")
NSUserDefaults.standardUserDefaults().synchronize()
他のクラスから:
NSUserDefaults.standardUserDefaults().objectForKey("deviceToken")
正直なところ、これが良い方法かどうかはわかりませんが、うまくいきます。