2017-01-27 9 views
4

ローカル通知を使用し、iOS 10をサポートするアプリがあります。以前のロケーション通知APIを使用する必要があるiOS 9のサポートを追加しようとしています。私はiOS 10のコードで@availableと#availableを使用しようとしていますが、iOS 10を実行しているデバイスでのみセンター変数を取得する方法を理解できません。ストアドプロパティで@availableを使用する

ターゲットをiOS 10から9この変数のエラーメッセージが表示されます。「UNUserNotificationCenterはiOS 10.0以降でのみ使用できます。」これは、iOS 9で使用されるこのクラスのコードがあるので、私がしたくないクラス全体に「@available(iOS 10.0、*)」を追加することを示唆しています。中央プロパティは、ちょうどiOSの10

class ViewController: UIViewController, UITextFieldDelegate { 

    let center = UNUserNotificationCenter.current() 
    ... 

答えて

1

@availableはなく、性質のために、クラス全体または1つの以上の機能を中心に使用することができます。あなたのUNUserNotificationCenterの使用状況について

は、current変化したことがないので、なぜちょうどcenter定数を削除していない、とだけcenterが使用されているUNUserNotificationCenter.current()を使用するシングルトンを返しますか?以下のようにiOSの10のための固有のコードを決定する

+0

ありがとうございます! – chickenparm

-1
let validClass = NSClassFromString("UNUserNotificationCenter") != nil 

使用validClass

以下
if validClass 
    // iOS 10 code 
else 
    // Earlier than iOS 10 code 
+0

これは、空き状況を確認するための良い方法ではありません。 Appleが推奨する方法は 'if #available()'の構文です。しかし、いずれのメソッド(この答えまたは 'if#available')も格納されたプロパティで使用できません。 – willrichman

8

は、潜在的な解決策(blog postのおかげで)です。

考えられるのは、タイプがAnyのストアドプロパティを使用して、格納されたプロパティをキャストする(必要に応じてインスタンス化する)計算されたプロパティを作成することです。

private var _selectionFeedbackGenerator: Any? = nil 
@available(iOS 10.0, *) 
fileprivate var selectionFeedbackGenerator: UISelectionFeedbackGenerator { 
    if _selectionFeedbackGenerator == nil { 
     _selectionFeedbackGenerator = UISelectionFeedbackGenerator() 
    } 
    return _selectionFeedbackGenerator as! UISelectionFeedbackGenerator 
} 
関連する問題