for - funciones en swift 4
Cómo pasar varios valores de enumeración como un parámetro de función (7)
Edición: En Swift 3.0 :
let options: NSStringDrawingOptions = [.usesLineFragmentOrigin, .usesFontLeading]
Edición: Esta es la forma en que usaría las opciones enumeradas en Swift 2.0 :
let options: NSStringDrawingOptions = [.UsesLineFragmentOrigin, .UsesFontLeading]
Edición: el problema se resolvió en iOS 8.3 SDK Beta 1 (12F5027d) :
NSStringDrawingOptions
modificadas [estructura]
- Desde:
enum NSStringDrawingOptions : Int
- Para:
struct NSStringDrawingOptions : RawOptionSetType
Ahora puedes escribir:
let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading
Después de algunas investigaciones y el comentario de @Anton Tcholakov:
Si está apuntando a OS X 10.10, esta es una forma simple de hacerlo:
let size = CGSize(width: 280, height: Int.max) let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading let boundingRect = string.bridgeToObjectiveC().boundingRectWithSize(size, options: options, attributes: attributes, context: nil)
Sin embargo, en iOS 8 SDK (en la semilla actual), hay un error, donde
NSStringDrawingOptions
es portado a Swift comoenum : Int
, en lugar destruct : RawOptionSet
. Debería enviar un informe de error a Apple describiendo este grave problema.
Cómo haría lo siguiente: pasar dos opciones de NSStringDrawing como un parámetro de función en swift:
CGRect boundingRect = [string boundingRectWithSize:CGSizeMake(280.0, NSIntegerMax)
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes:options context:nil];
En Swift 2.1 podemos usar,
calculatedRect = (text as NSString).boundingRectWithSize(bounds.size, options: NSStringDrawingOptions([.UsesLineFragmentOrigin, .UsesFontLeading]), attributes: [NSFontAttributeName : font], context: nil)
para pasar varios valores de enumeración para un parámetro.
Otra solución, utilice unsafeBitCast
.
Como abajo:
let options = unsafeBitCast(NSStringDrawingOptions.UsesLineFragmentOrigin.rawValue |
NSStringDrawingOptions.UsesFontLeading.rawValue,
NSStringDrawingOptions.self)
Parece que no puedo comentar la publicación de akashivskyy (que no tiene más de 50 de reputación), pero esto parece funcionar en mi final:
import Cocoa
let drawingOpts : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading
let boundingRect = "test".bridgeToObjectiveC().boundingRectWithSize(CGSize(width: 280, height: Int.max), options: drawingOpts, attributes: nil)
Además, si hago Cmd + clic NSStringDrawingOptions, lo veo como heredado de RawOptionSet.
Swift es compatible con el operador OR bitwise de C, pero los valores de la enumeración están ahora en un ámbito específico en lugar de ser simplemente símbolos globales:
let boundingRect = "fpp".boundingRectWithSize(CGSizeMake(280.0, CGFloat.max),
options:NSStringDrawingOptions.UsesLineFragmentOrigin | NSStringDrawingOptions.UsesFontLeading,
attributes:nil, context:nil)
en Swift 2.0 que será algo así como
theStringDrawingOptions = [NSStringDrawingOptions.UsesLineFragmentOrigin,
NSStringDrawingOptions.UsesFontLeading]
ver conferencia wwdc 2015 -> 106_hd_whats_new_in_swift en 6 min
Respuesta actualizada para Xcode 6.3:
en Xcode 6.3 Beta (Swift 1.2) esto finalmente se solucionó, puedes hacerlo ahora así:
let boundingRect = "string".boundingRectWithSize(size, options: .UsesLineFragmentOrigin | .UsesFontLeading, attributes:nil, context:nil)
Para la versión antigua:
Parece un error en la versión beta actual, por ahora escribo el método Objective-C y lo uso desde Swift:
+ (NSStringDrawingOptions)combine:(NSStringDrawingOptions)option1 with:(NSStringDrawingOptions)option2
{
return option1 | option2;
}
y llame al formulario Swift:
let boundingRect = "string".boundingRectWithSize(size, options: StringDrawingOptions.combine(.UsesLineFragmentOrigin, with: .UsesFontLeading), attributes:nil, context:nil)