¿Hay alguna manera de hacer la asignación condicional a las constantes en Swift?

Me gustaría crear un valor inmutable al que se le asignen diferentes valores dependiendo de una condición. En Scala podré escribir lo siguiente:

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

pero dado que las sentencias Swift si no devuelven el resultado del bloque de código ejecutado que no funciona.

Si la testing fuera para un Bool normal, podría usar el operador condicional ternario

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

pero eso no funciona para las testings de la versión de iOS, obtengo el siguiente error:

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

Siento que estoy atrapado con una var, pero a less que también sea opcional, en la mayoría de los casos, termino con una asignación doble, lo que parece tan feo e innecesario.

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

¡Gracias por cualquier ayuda!

Haga la statement y la asignación en dos líneas separadas:

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

Aunque es un let , puedes hacer la asignación (solo una vez por ruta de control) en una línea separada.

Creo que quieres algo como esto:

 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 

También podrías hacer esto

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

al hacer esto, no puede asignar un valor a la variable someConstant incluso si es una var y no una let porque es una propiedad calculada