2016-12-03 11 views
9

Chciałbym utworzyć niezmienną wartość, której przypisano różne wartości w zależności od warunku. W Scali byłbym w stanie napisać:Czy istnieje sposób na warunkowe przypisanie do stałych w Swift?

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

, ale ponieważ Swift if instrukcje nie zwracają wyniku wykonanego bloku kodu, który nie działa.

Jeśli test był dla normalnego Bool mogę użyć potrójny operator warunkowy

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

ale to nie działa do testów wersji iOS, pojawia się następujący błąd:

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

Czuję, że utknąłem z var, ale jeśli nie zrobię tego opcjonalnie, w większości przypadków mam podwójne zadanie, które wydaje się tak nieprzyjemne i niepotrzebne?

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

Dzięki za pomoc!

Odpowiedz

8

Czy zgłoszenie i przydział na dwóch oddzielnych linii:

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

Mimo to let, można wykonać zadanie (tylko raz na ścieżce kontroli) w osobnej linii.

+0

Dzięki, właśnie tego szukałem! – srcmonster

4

Myślę, że chcesz coś takiego:

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

To nie działa, ponieważ zadeklarowałeś "wartość". Jest to kluczowy element PO. – dfd

+3

Tworzy. Spójrz na drugą odpowiedź, która jest prawie identyczna z tą. Powinieneś to sprawdzić, zanim coś nie zadziała. – bsarrazin

+0

Uzgodnione. Myliłem się. Nauczyłem się lekcji Swift na cały dzień! – dfd

1

Można to zrobić także

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

w ten sposób nie można przypisać wartość do zmiennej someConstant nawet jeśli jest to var i nie jest to let, ponieważ jest to obliczona właściwość

Powiązane problemy