따라서 AnyObject는 ID의 영적 후계자이므로 AnyObject에서 원하는 모든 메시지를 호출 할 수 있습니다. 그것은 id로 메시지를 보내는 것과 같습니다. 알았어, 충분 해 그러나 이제 AnyObject 에서 모든 메소드가 선택 사항 이라는 개념을 추가하고 작업 할 수있는 것이 있습니다.
위의 내용을 감안할 때 UIApplication.sharedApplication ()을 AnyObject로 캐스팅 한 다음 메소드 서명과 동일한 변수를 만들고 해당 변수를 선택적 메소드로 설정 한 다음 변수를 테스트 할 수 있기를 바랍니다. 이것은 작동하지 않는 것 같습니다. 내 생각에 iOS 8.0 SDK에 대해 컴파일 할 때 컴파일러는 메소드 가 어디에서 하므로 메모리 조회까지 최적화합니다. 변수를 테스트하려고 시도 할 때까지 모든 것이 잘 작동합니다.이 시점에서 EXC_BAD_ACCESS를 얻습니다.
그러나 모든 메소드가 선택적이라는 보석을 발견 한 동일한 WWDC 대화에서 선택적 체인을 사용하여 선택적 메소드를 호출합니다. 불충분 한 부분은 실제로 존재하는지 알기 위해 메소드를 호출해야한다는 것입니다. 알림을 등록하기 전에이 메소드가 존재하는지 알아 내려고하기 때문에 알림을 등록하는 경우 문제가됩니다. UIUserNotificationSettings 객체. 그래도 nil을 사용하여 해당 메소드를 호출하는 것이 좋습니다. 그래서 나를 위해 작동하는 것 같습니다 :
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 베타에서 위의 코드는 더 이상 작동하지 않으며 아래 코드는 작동합니다.
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)
}