ดังนั้นปรากฎว่าเนื่องจาก AnyObject เป็นผู้สืบทอดทางจิตวิญญาณที่จะ id คุณสามารถโทรข้อความใด ๆ ที่คุณต้องการใน AnyObject นั่นเท่ากับการส่งข้อความถึง id ตกลงยุติธรรมพอ แต่ตอนนี้เราเพิ่มแนวคิดที่ว่าวิธีการทั้งหมดเป็นตัวเลือกใน AnyObjectและเรามีบางสิ่งที่เราสามารถทำงานได้
จากข้างบนฉันหวังว่าฉันจะส่ง UIApplication.sharedApplication () ไปที่ AnyObject จากนั้นสร้างตัวแปรที่เท่ากับลายเซ็นของเมธอดตั้งค่าตัวแปรนั้นเป็นวิธีเลือกจากนั้นทดสอบตัวแปร ดูเหมือนจะไม่ได้ผล ฉันเดาว่าเมื่อรวบรวมกับ iOS 8.0 SDK คอมไพเลอร์รู้ว่ามันคิดว่าวิธีการนั้นควรอยู่ที่ใดดังนั้นมันจึงปรับสิ่งเหล่านี้ให้เหมาะกับการค้นหาหน่วยความจำ ทุกอย่างทำงานได้ดีจนกระทั่งฉันพยายามทดสอบตัวแปร ณ จุดนี้ฉันจะได้รับ EXC_BAD_ACCESS
อย่างไรก็ตามในการพูดคุย WWDC เดียวกันกับที่ฉันพบอัญมณีเกี่ยวกับวิธีการทั้งหมดเป็นทางเลือกพวกเขาใช้การเชื่อมต่อแบบเลือกได้เพื่อเรียกวิธีการเลือก - และสิ่งนี้ดูเหมือนว่าจะใช้งานได้ ส่วนขาขาดคือคุณต้องพยายามโทรหาวิธีเพื่อทราบว่ามีอยู่จริงหรือไม่ซึ่งในกรณีของการลงทะเบียนเพื่อรับการแจ้งเตือนนั้นเป็นปัญหาเพราะคุณกำลังพยายามหาวิธีนี้ก่อนที่คุณจะสร้าง วัตถุ UIUserNotificationSettings ดูเหมือนว่าการเรียกใช้เมธอดด้วยศูนย์แม้ว่าจะไม่เป็นไรดังนั้นวิธีแก้ปัญหาที่ดูเหมือนจะใช้ได้กับฉันก็คือ:
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)
}
หลังจากการค้นหามากเกี่ยวกับสิ่งนี้ข้อมูลสำคัญมาจากการพูดคุยของ WWDC https://developer.apple.com/videos/wwdc/2014/#407ตรงกลางตรงส่วนที่เกี่ยวกับ "วิธีการเพิ่มเติมในโปรโตคอล"
ใน Xcode 6.1 beta โค้ดด้านบนไม่ทำงานอีกต่อไปรหัสด้านล่างใช้งานได้:
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)
}