Bu nedenle, AnyObject'in kimliğin manevi ardılı olması nedeniyle, AnyObject'te istediğiniz herhangi bir mesajı çağırabileceğiniz ortaya çıkıyor. Bu, kimliğe mesaj göndermeye eşdeğerdir. Tamam, yeterince adil. Ancak şimdi, tüm yöntemlerin AnyObject'te isteğe bağlı olduğu kavramını ekliyoruz ve birlikte çalışabileceğimiz bir şey var.
Yukarıdakiler göz önüne alındığında, ben sadece AnyObject UIApplication.sharedApplication () döküm, sonra yöntem imzasına eşit bir değişken oluşturmak, bu değişkeni isteğe bağlı yönteme ayarlamak, sonra değişkeni umuyordu. Bu işe yaramadı. Benim tahminim, iOS 8.0 SDK'ya karşı derlendiğinde, derleyicinin bu yöntemin nerede olması gerektiğini düşündüğünü bilmesi, bu yüzden bunu bir bellek aramasına göre optimize ediyor. Değişkeni test etmeye çalışana kadar her şey iyi çalışıyor, bu noktada bir EXC_BAD_ACCESS aldım.
Ancak, aynı WWDC konuşma nerede isteğe bağlı tüm yöntemler hakkında mücevher bulundu, isteğe bağlı bir yöntem çağırmak için isteğe bağlı zincirleme kullanın - ve bu işe yarar görünüyor. Topal kısmı, bildirimlerin kaydedilmesi durumunda bir sorun olduğundan, var olup olmadığını bilmek için yöntemi çağırmaya çalışmanız gerektiğinden, bir yöntem oluşturmadan önce bu yöntemin var olup olmadığını anlamaya çalışıyorsunuz UIUserNotificationSettings nesnesi. Bu yöntemi nil ile çağırmak iyi gibi görünüyor, bu yüzden benim için çalışıyor gibi görünen çözüm:
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)
}
Bununla ilgili çok fazla arama yaptıktan sonra, bu WWDC konuşmasından "Protokollerde İsteğe Bağlı Yöntemler" bölümünün tam ortasında https://developer.apple.com/videos/wwdc/2014/#407 geldi.
Xcode 6.1 beta sürümünde yukarıdaki kod artık çalışmaz, aşağıdaki kod çalışır:
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)
}