Il s'avère donc que, comme AnyObject est le successeur spirituel de id, vous pouvez appeler n'importe quel message de votre choix sur AnyObject. C'est l'équivalent d'envoyer un message à id. OK très bien. Mais maintenant, nous ajoutons dans le concept que toutes les méthodes sont facultatives sur AnyObject , et nous avons quelque chose avec lequel nous pouvons travailler.
Compte tenu de ce qui précède, j'avais bon espoir de pouvoir simplement convertir UIApplication.sharedApplication () en AnyObject, puis créer une variable égale à la signature de la méthode, définir cette variable sur la méthode facultative, puis tester la variable. Cela ne semblait pas fonctionner. Je suppose que lorsqu'il est compilé avec le SDK iOS 8.0, le compilateur sait où il pense que cette méthode devrait être, il optimise donc tout cela jusqu'à une recherche de mémoire. Tout fonctionne bien jusqu'à ce que j'essaie de tester la variable, auquel cas j'obtiens un EXC_BAD_ACCESS.
Cependant, dans le même discours sur la WWDC où j'ai trouvé le joyau de toutes les méthodes étant facultatives, ils utilisent le chaînage facultatif pour appeler une méthode facultative - et cela semble fonctionner. La partie boiteuse est que vous devez réellement essayer d'appeler la méthode afin de savoir si elle existe, ce qui dans le cas de l'inscription aux notifications est un problème parce que vous essayez de déterminer si cette méthode existe avant de créer un Objet UIUserNotificationSettings. Il semble que d'appeler cette méthode avec nil soit correct, donc la solution qui semble fonctionner pour moi est:
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)
}
Après de nombreuses recherches à ce sujet, les informations clés sont venues de cette conférence de la WWDC https://developer.apple.com/videos/wwdc/2014/#407 en plein milieu de la section sur les "Méthodes facultatives dans les protocoles"
Dans Xcode 6.1 beta, le code ci-dessus ne fonctionne plus, le code ci-dessous fonctionne:
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)
}