Es stellt sich also heraus, dass Sie, da AnyObject der spirituelle Nachfolger von id ist, jede gewünschte Nachricht auf AnyObject aufrufen können. Dies entspricht dem Senden einer Nachricht an id. OK Fair genug. Aber jetzt fügen wir dem Konzept hinzu, dass alle Methoden in AnyObject optional sind und wir etwas haben, mit dem wir arbeiten können.
Vor diesem Hintergrund hoffte ich, dass ich UIApplication.sharedApplication () einfach in AnyObject umwandeln, dann eine Variable erstellen konnte, die der Methodensignatur entspricht, diese Variable auf die optionale Methode setzen und dann die Variable testen konnte. Das schien nicht zu funktionieren. Ich vermute, dass der Compiler beim Kompilieren mit dem iOS 8.0 SDK weiß, wo er diese Methode finden sollte , und dies alles bis hin zu einer Speichersuche optimiert. Alles funktioniert einwandfrei, bis ich versuche, die Variable zu testen. An diesem Punkt erhalte ich eine EXC_BAD_ACCESS.
In demselben WWDC-Vortrag, in dem ich festgestellt habe, dass alle Methoden optional sind, verwenden sie die optionale Verkettung, um eine optionale Methode aufzurufen - und dies scheint zu funktionieren. Der lahme Teil ist, dass Sie tatsächlich versuchen müssen, die Methode aufzurufen, um zu wissen, ob sie vorhanden ist. Dies ist bei der Registrierung für Benachrichtigungen ein Problem, da Sie versuchen, herauszufinden, ob diese Methode vorhanden ist, bevor Sie eine erstellen UIUserNotificationSettings-Objekt. Es scheint, als wäre es in Ordnung, diese Methode mit nil aufzurufen. Die Lösung, die für mich zu funktionieren scheint, lautet also:
var ao: AnyObject = UIApplication.sharedApplication()
if let x:Void = ao.registerUserNotificationSettings?(nil) {
// It's iOS 8
var types = UIUserNotificationType.Badge | UIUserNotificationType.Sound | UIUserNotificationType.Alert
var settings = UIUserNotificationSettings(forTypes: types, categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
} else {
// It's older
var types = UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound | UIRemoteNotificationType.Alert
UIApplication.sharedApplication().registerForRemoteNotificationTypes(types)
}
Nach langem Suchen im Zusammenhang damit kamen die wichtigsten Informationen aus diesem WWDC-Vortrag https://developer.apple.com/videos/wwdc/2014/#407 genau in der Mitte des Abschnitts über "Optionale Methoden in Protokollen".
In Xcode 6.1 Beta funktioniert der obige Code nicht mehr, der folgende Code funktioniert:
if UIApplication.sharedApplication().respondsToSelector("registerUserNotificationSettings:") {
// It's iOS 8
var types = UIUserNotificationType.Badge | UIUserNotificationType.Sound | UIUserNotificationType.Alert
var settings = UIUserNotificationSettings(forTypes: types, categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
} else {
// It's older
var types = UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound | UIRemoteNotificationType.Alert
UIApplication.sharedApplication().registerForRemoteNotificationTypes(types)
}