如何传递多个枚举值作为函数参数

我将如何做到以下几点 – 在swift中传递两个NSStringDrawing选项作为函数参数:

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

编辑:在Swift 3.0中

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

编辑: 这是你将如何使用Swift 2.0中的选项枚举

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

编辑: 问题已经在iOS 8.3 SDK Beta 1(12F5027d)中解决

修改后的NSStringDrawingOptions [结构]

  • 来自: enum NSStringDrawingOptions : Int
  • 要: struct NSStringDrawingOptions : RawOptionSetType

你现在可以写:

 let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading 

经过一番研究和@Anton Tcholakov的“评论”:

  1. 如果你的目标是OS X 10.10,这是简单的方法:

     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. 但是,在iOS 8 SDK(在当前的种子)中,存在一个错误,其中NSStringDrawingOptions作为enum : Int而不是struct : RawOptionSet移植到Swift。 你应该向苹果发送一个错误报告,描述这个严重的问题。

更新了Xcode 6.3的答案:

在Xcode 6.3 Beta(Swift 1.2)中这个问题终于修复了,你现在可以这样做:

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

对于旧版本:

它看起来像当前testing版中的一个错误,现在我编写Objective-C方法并使用它从Swift:

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

并调用Swiftforms:

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

另一个解决scheme,使用unsafeBitCast

如下所示:

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

在Swift 2.1中,我们可以使用,

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

为parameter passing多个枚举值。

在迅速2.0,这将是类似的东西

 theStringDrawingOptions = [NSStringDrawingOptions.UsesLineFragmentOrigin, NSStringDrawingOptions.UsesFontLeading] 

在6分钟内看到讲座wwdc 2015 – > 106_hd_whats_new_in_swift

似乎无法评论akashivskyy的职位(没有得到50 +声望),但这似乎在我的工作:

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

另外,如果我Cmd +单击NSStringDrawingOptions我看到它从RawOptionSetinheritance。

Swift支持C的按位或运算符,但枚举的值现在在一个特定的范围,而不是简单的全局符号:

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