Vì vậy, hóa ra bởi vì AnyObject là sự kế thừa tinh thần cho id, bạn có thể gọi bất kỳ tin nhắn nào bạn muốn trên AnyObject. Điều đó tương đương với việc gửi tin nhắn đến id. Được rồi. Nhưng bây giờ chúng tôi thêm vào khái niệm rằng tất cả các phương thức là tùy chọn trên AnyObject và chúng tôi có một cái gì đó chúng tôi có thể làm việc với.
Với những điều trên, tôi đã hy vọng tôi có thể truyền UIApplication. SharedApplication () cho AnyObject, sau đó tạo một biến bằng với chữ ký phương thức, đặt biến đó thành phương thức tùy chọn, sau đó kiểm tra biến. Điều này dường như không hoạt động. Tôi đoán là khi được biên dịch dựa trên SDK iOS 8.0, trình biên dịch sẽ biết nó nghĩ phương thức đó ở đâu, vì vậy nó tối ưu hóa tất cả điều này xuống để tra cứu bộ nhớ. Mọi thứ hoạt động tốt cho đến khi tôi thử kiểm tra biến, tại thời điểm đó tôi nhận được EXC_BAD_ACCESS.
Tuy nhiên, trong cùng một cuộc nói chuyện WWDC nơi tôi đã tìm thấy viên ngọc về tất cả các phương thức là tùy chọn, họ sử dụng Chuỗi tùy chọn để gọi một phương thức tùy chọn - và điều này dường như hoạt động. Phần khập khiễng là bạn phải thực sự gọi phương thức để biết nó có tồn tại hay không, trong trường hợp đăng ký thông báo là một vấn đề vì bạn đang cố gắng tìm hiểu xem phương thức này có tồn tại trước khi bạn tạo Đối tượng UIUserNotificationSinstall. Có vẻ như gọi phương thức đó bằng nil mặc dù không sao, vì vậy giải pháp có vẻ hiệu quả với tôi là:
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)
}
Sau nhiều tìm kiếm liên quan đến vấn đề này, thông tin chính đến từ cuộc nói chuyện WWDC này https://developer.apple.com/ideo/wwdc/2014/#407 ngay giữa phần về "Phương thức tùy chọn trong giao thức"
Trong Xcode 6.1 beta, đoạn mã trên không hoạt động nữa, đoạn mã bên dưới hoạt động:
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)
}