2016-05-24 22 views
2

Es gibt schöne @ available Attribut in Swift, um die Verfügbarkeit in der Kompilierzeit zu testen. Zum Beispiel HKQuantityTypeIdentifierAppleExerciseTime Kennung ist nur verfügbar, da iOS 9.3, also, wenn wir es verwenden wollen, müssen wir die Verfügbarkeit wie folgt überprüfen:Swift Kompilierzeit Verfügbarkeit: nicht verfügbar Fall

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

aber ist es möglich, auch hier hinzufügen, wenn Bezeichner nicht verfügbar ist? Um gleiche Konstante in iOS < 9.3 als zu definieren:

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

Antwort

3

Sie können die Variable deklariert und initialisiert es mit #available:

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

    return [ 
     HKQuantityTypeIdentifierActiveEnergyBurned, 
     HKQuantityTypeIdentifierAppleExerciseTime 
    ] 
}() 

Sie im Wesentlichen versuchen, eine von zwei Variablen mit dem gleichen Namen zu erklären, und verschiedene Standardwerte, abhängig von einer Bedingung. Ich denke, es ist einfacher, eine einzelne Variable einmal zu deklarieren und dann ihren Standardwert abhängig von der gleichen Bedingung zuzuweisen. Das Gleiche gilt für die Klassen im Grunde genommen.

+0

kompiliert mit Fehler: Konklusion Rückgabetyp im aktuellen Kontext kann nicht – Vladimir

+0

Yeah entschuldigen, das war von der Spitze meines Kopfes und ich habe vergessen, explizit den Let-Typ angeben (die, wie der Compiler beschwert, kann ' t aus dem Zusammenhang abgeleitet werden). Ich habe meine Antwort mit einem ': [String]' aktualisiert - zögern Sie nicht, es jetzt erneut zu versuchen. –

0

Meine aktuelle Lösung ist wie folgt zu verwenden #available:

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

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

Aber es ist eine zusätzliche Komplikation und kann auch nicht auf ganze Klassen angewendet werden, so Frage noch offen ist.

+0

Bitte, glaube nicht, dass ich meine eigene Lösung verteidige - versuche eher zu verstehen, was du erreichen musst. Ich habe meine Antwort mit meinen Gedanken bezüglich Komplikationen aktualisiert, bitte lassen Sie mich wissen, wenn Sie mehr Kontext dazu liefern möchten, warum Sie diese spezifische Art und Weise, Dinge zu tun, befolgen müssen, um mir und anderen zu helfen, zu verstehen, wonach Sie suchen. –

+0

@Alex Ihre Antwort ist in Ordnung und ich habe es upvoted. Aber immer noch auf andere Lösungen warten. Z.B. nicht-available Fall für die ganze Klasse betrachten. – Vladimir

+0

Ok, sicher - obwohl für Klassen die gleiche Regel gilt, schätze ich: Anstatt eine von zwei Klassen mit demselben Namen zu definieren, möchten Sie vielleicht eine definieren und ihr Verhalten abhängig von der Verfügbarkeit der API anpassen. –