Como passar vários valores de enum como um parâmetro de function

Como eu faria o seguinte – passando duas opções de NSStringDrawing como um parâmetro de function em swift:

CGRect boundingRect = [string boundingRectWithSize:CGSizeMake(280.0, NSIntegerMax) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:options context:nil]; 

Editar: no Swift 3.0 :

 let options: NSStringDrawingOptions = [.usesLineFragmentOrigin, .usesFontLeading] 

Edit: É assim que você usaria a opção enum no Swift 2.0 :

 let options: NSStringDrawingOptions = [.UsesLineFragmentOrigin, .UsesFontLeading] 

Editar: o problema foi resolvido no iOS 8.3 SDK Beta 1 (12F5027d) :

Modificado NSStringDrawingOptions [struct]

  • De: enum NSStringDrawingOptions : Int
  • Para: struct NSStringDrawingOptions : RawOptionSetType

Agora você pode escrever:

 let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading 

Depois de algumas pesquisas ee do “comentário” de @Anton Tcholakov:

  1. Se você está segmentando o OS X 10.10, essa é uma maneira simples de fazer isso:

     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) 
  2. No entanto, no iOS 8 SDK (na semente atual), há um bug, onde NSStringDrawingOptions é portado para Swift como enum : Int , em vez de struct : RawOptionSet . Você deve enviar um relatório de erros para a Apple descrevendo este problema sério.

Resposta atualizada para o Xcode 6.3:

no Xcode 6.3 Beta (Swift 1.2) isso é finalmente corrigido, você pode fazer isso agora:

 let boundingRect = "string".boundingRectWithSize(size, options: .UsesLineFragmentOrigin | .UsesFontLeading, attributes:nil, context:nil) 

Para a versão antiga:

Parece um bug na versão beta atual, pois agora eu escrevo o método Objective-C e o uso do Swift:

 + (NSStringDrawingOptions)combine:(NSStringDrawingOptions)option1 with:(NSStringDrawingOptions)option2 { return option1 | option2; } 

e ligue para o formulário Swift:

 let boundingRect = "string".boundingRectWithSize(size, options: StringDrawingOptions.combine(.UsesLineFragmentOrigin, with: .UsesFontLeading), attributes:nil, context:nil) 

Outra solução, use unsafeBitCast .

Como abaixo:

 let options = unsafeBitCast(NSStringDrawingOptions.UsesLineFragmentOrigin.rawValue | NSStringDrawingOptions.UsesFontLeading.rawValue, NSStringDrawingOptions.self) 

No Swift 2.1 podemos usar,

 calculatedRect = (text as NSString).boundingRectWithSize(bounds.size, options: NSStringDrawingOptions([.UsesLineFragmentOrigin, .UsesFontLeading]), attributes: [NSFontAttributeName : font], context: nil) 

para passar vários valores enum para um parâmetro.

no rápido 2.0 que será algo como

 theStringDrawingOptions = [NSStringDrawingOptions.UsesLineFragmentOrigin, NSStringDrawingOptions.UsesFontLeading] 

veja palestra wwdc 2015 -> 106_hd_whats_new_in_swift em 6 min

Não consigo comentar o post de akashivsky (não tenho mais de 50 de reputação), mas isso parece funcionar do meu jeito:

 import Cocoa let drawingOpts : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading let boundingRect = "test".bridgeToObjectiveC().boundingRectWithSize(CGSize(width: 280, height: Int.max), options: drawingOpts, attributes: nil) 

Além disso, se eu Cmd + clique em NSStringDrawingOptions eu vejo como herdando de RawOptionSet.

O Swift suporta o operador OR bit a bit de C, mas os valores do enum estão agora em um escopo específico, em vez de simplesmente serem símbolos globais:

 let boundingRect = "fpp".boundingRectWithSize(CGSizeMake(280.0, CGFloat.max), options:NSStringDrawingOptions.UsesLineFragmentOrigin | NSStringDrawingOptions.UsesFontLeading, attributes:nil, context:nil)