2017-01-27 3 views
4

Ich habe eine App, die lokale Benachrichtigungen verwendet und iOS 10 unterstützt. Ich versuche, iOS 9-Unterstützung hinzuzufügen, die erfordert, dass ich die alte Standortbenachrichtigungs-API verwendet. Ich versuche @available und #available auf meinem iOS 10 Code zu verwenden und ich kann nicht herausfinden, wie ich meine Center-Variable nur für Geräte mit iOS 10 bekomme.Verwenden von @available mit gespeicherten Eigenschaften

Wenn ich mein Ziel von iOS 10 auf 9 Ich erhalte die Fehlermeldung für diese Variable: "UNUserNotificationCenter ist nur für iOS 10.0 oder neuer verfügbar." Es schlägt vor, dass ich "@available (iOS 10.0, *)" zu meiner gesamten Klasse hinzufüge, was ich nicht tun möchte, da es Code in dieser Klasse gibt, der für iOS 9 verwendet wird. Ich freue mich über Vorschläge zur Begrenzung meiner Center-Eigenschaft auf nur iOS 10.

class ViewController: UIViewController, UITextFieldDelegate { 

    let center = UNUserNotificationCenter.current() 
    ... 

Antwort

1

@available könnte um eine ganze Klasse oder eine oder mehrere Funktionen verwendet werden, aber nicht für Eigenschaften.

In Bezug auf Ihre UNUserNotificationCenter Nutzung, current gibt einen Singleton, die sich nie ändert, warum also nicht nur entfernen Sie die center konstant, und verwenden Sie nur UNUserNotificationCenter.current() wo center verwendet wird?

+0

Danke das macht Sinn! – chickenparm

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

Verwenden validClass entscheiden Code spezifisch für iOS 10 wie:

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

Dies ist keine gute Möglichkeit, die Verfügbarkeit zu überprüfen. Apples bevorzugte Methode ist die 'if #available()' -Syntax. Beide Methoden (diese Antwort oder "wenn verfügbar") können jedoch nicht für gespeicherte Eigenschaften verwendet werden. – willrichman

8

Nachfolgend finden Sie eine mögliche Lösung (dank blog post).

Die Idee besteht darin, eine gespeicherte Eigenschaft mit dem Typ Any zu verwenden und dann eine berechnete Eigenschaft zu erstellen, die die gespeicherte Eigenschaft ausgibt (und bei Bedarf instanziiert).

private var _selectionFeedbackGenerator: Any? = nil 
@available(iOS 10.0, *) 
fileprivate var selectionFeedbackGenerator: UISelectionFeedbackGenerator { 
    if _selectionFeedbackGenerator == nil { 
     _selectionFeedbackGenerator = UISelectionFeedbackGenerator() 
    } 
    return _selectionFeedbackGenerator as! UISelectionFeedbackGenerator 
} 
Verwandte Themen