したがって、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)
}