2016-12-03 2 views
9

Ich möchte einen unveränderlichen Wert erstellen, der abhängig von einer Bedingung unterschiedliche Werte zugewiesen bekommt. In Scala würde ich in der Lage sein, die folgenden schreiben:Gibt es eine Möglichkeit, bedingte Zuweisung zu Konstanten in Swift zu tun?

let attribs = if #available(iOS 8.2, *) { 
     [ NSFontAttributeName: UIFont.systemFontOfSize(30, weight: UIFontWeightLight) ] 
    } else { 
     [ NSFontAttributeName: UIFont.systemFontOfSize(30) ] 
    } 

aber da Swift wenn Anweisungen geben nicht das Ergebnis der Codeblock ausgeführt, das nicht funktioniert.

Wenn der Test für einen normalen Bool ist ich die ternäre Konditionaloperator

let attribs = #available(iOS 8.2, *) ? 
     [ NSFontAttributeName: UIFont.systemFontOfSize(30, weight: UIFontWeightLight) ] 
    : 
     [ NSFontAttributeName: UIFont.systemFontOfSize(30) ] 

verwenden könnte, aber das funktioniert nicht für die iOS-Version Tests, bekomme ich folgende Fehlermeldung:

#available may only be used as condition of an 'if', 'guard' or 'while' statement. 

Ich fühle mich, als ob ich mit einer Var stecken bleibe, aber wenn ich es auch nicht optional mache, endet in den meisten Fällen eine Doppelaufgabe, die so hässlich und unnötig erscheint.

var attribs = [ NSFontAttributeName: UIFont.systemFontOfSize(30) ] 
    if #available(iOS 8.2, *) { 
     [ NSFontAttributeName: UIFont.systemFontOfSize(30, weight: UIFontWeightLight) ] 
    } 

Danke für jede Hilfe!

Antwort

8

Sie die Deklaration und Zuordnung auf zwei getrennten Leitungen:

let attribs: [String: Any] 
if #available(iOS 8.2, *) { 
    attribs = [NSFontAttributeName: UIFont.systemFontOfSize(30, weight: UIFontWeightLight)] 
} else { 
    attribs = [NSFontAttributeName: UIFont.systemFontOfSize(30)] 
} 

Auch wenn es ein let ist, können Sie die Zuordnung tun (nur einmal pro Pfad der Kontrolle) auf einer separaten Zeile.

+0

Danke, das war genau das, was ich gesucht habe! – srcmonster

4

Ich glaube, Sie so etwas wie dies wollen:

let value: String 
if #available(iOS 9, *) { 
    value = "iOS 9 is available" 
} else { 
    value = "iOS 9 and up only" 
} 
print(value) // iOS 9 is available 
+0

Dies wird nicht erstellt, da Sie "value" als let deklariert haben. Dies ist ein Schlüsselstück des OP. – dfd

+3

Es baut sich. Sehen Sie sich die zweite Antwort an, die mit dieser ziemlich identisch ist. Sie sollten dies wirklich testen, bevor Sie behaupten, etwas funktioniert nicht. – bsarrazin

+0

Einverstanden. Ich habe mich geirrt. Hat meine schnelle Lektion für den Tag gelernt! – dfd

1

Sie auch diese

var someConstant:String { 
    if #available(iOS 9, *) { 
     return "iOS 9" 
    } else { 
     return"not iOS 9" 
    } 
} 

, indem Sie diese tun könnten Sie keinen Wert auf die Variable someConstant selbst zuweisen können, wenn es sich um eine var und kein let weil es eine berechnete Eigenschaft ist

Verwandte Themen