Jadi ternyata karena AnyObject adalah penerus spiritual untuk id, Anda dapat memanggil pesan apa pun yang Anda inginkan di AnyObject. Itu sama dengan mengirim pesan ke id. OK cukup adil. Tetapi sekarang kita menambahkan dalam konsep bahwa semua metode adalah opsional pada AnyObject , dan kami memiliki sesuatu yang dapat kami kerjakan.
Mengingat hal di atas, saya berharap saya bisa melemparkan UIApplication.sharedApplication () ke AnyObject, lalu membuat variabel yang sama dengan metode signature, mengatur variabel itu ke metode opsional, kemudian menguji variabel tersebut. Ini sepertinya tidak berhasil. Dugaan saya adalah bahwa ketika dikompilasi dengan iOS 8.0 SDK, kompiler tahu di mana ia berpikir metode itu seharusnya , jadi ini mengoptimalkan semua ke pencarian memori. Semuanya berfungsi dengan baik sampai saya mencoba menguji variabel, pada titik mana saya mendapatkan EXC_BAD_ACCESS.
Namun, dalam pembicaraan WWDC yang sama di mana saya menemukan permata tentang semua metode menjadi opsional, mereka menggunakan Chaining Opsional untuk memanggil metode opsional - dan ini tampaknya berhasil. Bagian lumpuh adalah bahwa Anda harus benar-benar mencoba memanggil metode untuk mengetahui apakah itu ada, yang dalam kasus mendaftar untuk pemberitahuan adalah masalah karena Anda mencoba mencari tahu apakah metode ini ada sebelum Anda membuat sebuah Objek UIUserNotificationSettings. Sepertinya memanggil metode itu dengan nihil tidak apa-apa, jadi solusi yang tampaknya bekerja untuk saya adalah:
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)
}
Setelah banyak pencarian terkait dengan ini, info kunci datang dari ceramah WWDC ini https://developer.apple.com/videos/wwdc/2014/#407 tepat di tengah pada bagian tentang "Metode Opsional dalam Protokol"
Dalam Xcode 6.1 beta kode di atas tidak berfungsi lagi, kode di bawah ini berfungsi:
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)
}