Überprüfen Sie, ob eine Funktion in Swift verfügbar ist.

9

Ich möchte feststellen, ob der Benutzer Transparenz reduzieren aktiviert hat. Es ist einfach, Sie rufen einfach die Funktion UIAccessibilityIsReduceMotionEnabled() auf und es wird Bool zurückgegeben. Aber meine App zielt auf iOS 7 und 8 und diese Funktion ist nicht auf iOS 7 verfügbar.

In Objective-C habe ich überprüft, ob diese Funktion existiert:

%Vor%

In Swift kann ich nicht herausfinden, wie ich prüfen kann, ob es existiert oder nicht. Laut diese Antwort können Sie einfach die optionale Verkettung verwenden und falls dies der Fall ist nil , dann existiert es nicht, aber das ist offenbar auf Obj-C-Protokolle beschränkt. Xcode 6.1 mag das nicht:

%Vor%

Es möchte, dass Sie die? entfernen. Und natürlich stürzt es bei iOS 7 ab, weil diese Funktion nicht existiert.

Was ist der richtige Weg, um zu überprüfen, ob diese Arten von Funktionen existieren?

    
Joey 03.11.2014, 02:24
quelle

4 Antworten

8

In Swift 2 wurde eine korrekte Verfügbarkeitsprüfung hinzugefügt. Dies wird gegenüber anderen hier genannten Optionen empfohlen.

%Vor%     
Joey 16.08.2015, 22:17
quelle
5

Wenn Sie ein bisschen frech sind, können Sie die UIKit-Binärdatei immer mit dem Bibliothekslader öffnen und prüfen, ob das Symbol aufgelöst werden kann:

%Vor%

Die Aufrufe dlopen und dlsym können etwas teuer sein, daher würde ich empfehlen, das dlopen - Handle für die Lebensdauer der Anwendung offen zu lassen und irgendwo das Ergebnis von dlsym zu speichern. Wenn Sie dies nicht tun, stellen Sie sicher, dass Sie dlclose it.

Soweit ich weiß, ist dies AppStore sicher, da UIAccessibilityIsReduceMotionEnabled eine öffentliche API ist.

    
aethe 03.11.2014 03:38
quelle
2

Sie können überprüfen, ob Sie in iOS 8 oder höher laufen -

%Vor%

Ich denke nicht es gibt eine andere Art zu erzählen. In der Theorie, wenn Sie in der Lage wären zu überprüfen, würde der Versuch, auf den Funktionsnamen ohne () zuzugreifen, Ihnen nil in iOS 7 und die Funktion () -> Bool in iOS 8 geben. Damit dies jedoch geschieht, UIAccessibilityIsReduceMotionEnabled müsste als (() -> Bool)? definiert werden, was nicht der Fall ist. Das Austesten führt zu einer Funktionsinstanz in beiden Versionen von iOS, die abstürzt, wenn sie in iOS 7 aufgerufen wird:

%Vor%

Der einzige Weg, wie ich es sehen kann, ohne die Version zu testen, ist einfach, Ihre eigene C-Funktion zu definieren, um Ihre Bridging-Header-Datei einzuchecken und folgendes aufzurufen:

%Vor%     
Nate Cook 03.11.2014 02:35
quelle
0

Aus den Apple Developer-Dokumenten ( Verwenden von Swift mit Kakao und Objective- C (Swift 3) & gt; Interoperabilität & gt; Übernahme von Cocoa Design Patterns & gt; API-Verfügbarkeit ):

  

Swift-Code kann die Verfügbarkeit von APIs als Bedingung verwenden   Laufzeit. Verfügbarkeitsprüfungen können anstelle einer Bedingung in einem verwendet werden   Kontrollflussanweisung, z. B. if , guard oder while   Aussage.

     

Wenn Sie das vorherige Beispiel verwenden, können Sie die Verfügbarkeit in if überprüfen.   Anweisung, die requestWhenInUseAuthorization() nur bei der Methode aufruft   ist zur Laufzeit verfügbar:

      %Vor%      

Alternativ können Sie die Verfügbarkeit in einer guard -Anweisung überprüfen,   der aus dem Geltungsbereich austritt, es sei denn, das aktuelle Ziel erfüllt die   spezifizierte Anforderungen. Dieser Ansatz vereinfacht die Handhabungslogik   verschiedene Plattformfähigkeiten.

%Vor%      

Jedes Plattformargument besteht aus einem der unten aufgeführten Plattformnamen.   gefolgt von der entsprechenden Versionsnummer. Das letzte Argument ist ein   Sternchen ( * ), mit dem potenzielle zukünftige Plattformen behandelt werden.

     

Plattformnamen:

     
  • iOS
  •   
  • iOSApplicationExtension
  •   
  • macOS
  •   
  • macOSApplicationExtension
  •   
  • watchOS
  •   
  • watchOSApplicationExtension
  •   
  • tvOS
  •   
  • tvOSApplicationExtension
  •   
    
Benjamin Cheah 13.10.2016 07:34
quelle

Tags und Links