2016-05-24 5 views
2

すぐにコンパイル時の可用性をテストするための素敵な@available属性があります。 など。スウィフトコンパイル時の可用性:使用できない場合

@available(iOS 9.3, *) 
public static let supportedTypes = [ 
    HKQuantityTypeIdentifierActiveEnergyBurned, 
    HKQuantityTypeIdentifierAppleExerciseTime 
] 

が、識別子が利用できないときもケースを追加することが可能です:HKQuantityTypeIdentifierAppleExerciseTime識別子が、我々はそれを使用したい場合は、私たちはこのように状況を確認するだけのiOS 9.3、 以降で使用可能ですか?あなたは変数を宣言し#availableでそれを初期化することができ

// iOS < 9.3 case: 
public static let supportedTypes = [ 
    HKQuantityTypeIdentifierActiveEnergyBurned 
] 

答えて

3

public static let supportedTypes: [String] = { 
    guard #available (iOS 9.3, *) else { 
     return [ HKQuantityTypeIdentifierActiveEnergyBurned ] 
    } 

    return [ 
     HKQuantityTypeIdentifierActiveEnergyBurned, 
     HKQuantityTypeIdentifierAppleExerciseTime 
    ] 
}() 

あなたは本質的に同じ名前の2つの変数のいずれかを宣言しようとしているとして、iOSの< 9.3で同じ定数を定義するには 条件によっては異なるデフォルト値が使用されます。単一の変数を一度宣言してから、同じ条件に応じてデフォルト値を割り当てる方が簡単だと思います。基本的にはクラスと同じです。

+0

これはエラーでコンパイルされます:現在のコンテキストでクロージャの戻り値の型を推論できません – Vladimir

+0

申し訳ありません、それは私の頭の上からのもので、明示的に 'let'型を指定するのを忘れていました(コンパイラが、文脈から推測される)。私は答えを ':[String]'で更新しました。今度はもう一度お試しください。 –

0

私の現在のソリューションは、このように#available使用することです:

static func setupTypes() -> [String] { 
    if #available(iOS 9.3, *) { 
     return [ 
      HKQuantityTypeIdentifierActiveEnergyBurned, 
      HKQuantityTypeIdentifierAppleExerciseTime 
     ] 
    else{ 
     return [ 
      HKQuantityTypeIdentifierActiveEnergyBurned, 
     ] 
    }  
} 

public static let supportedTypes:[String] = MyClass.setupTypes() 

しかし、それは追加の合併症であり、また、クラス全体に適用することはできませんので、質問がまだ開いています。

+0

私が自分の解決策を守っているとは思わないでください。むしろあなたが達成する必要があることを理解しようとしています。私は合併症に関する私の考えを反映して私の答えを更新しました。なぜあなたがこの特定のやり方で行動する必要があるか、私と他の人があなたが探しているものを理解するのを助けるために、 –

+0

@Alexあなたの答えは大丈夫です、私はそれをupvotedしました。しかし、まだ他の解決策を待っています。例えば。クラス全体で非妥当な事例を考慮する。 – Vladimir

+0

もちろん、同じルールが同じルールに適用されますが、同じ名前の2つのクラスのいずれかを定義するのではなく、1つを定義してAPIの可用性に応じて動作を調整することができます。 –

関連する問題