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

dev*_*com 39 swift

我将如何执行以下操作 - 在swift中将两个NSStringDrawing选项作为函数参数传递:

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

aka*_*kyy 69

编辑:在Swift 3.0中:

let options: NSStringDrawingOptions = [.usesLineFragmentOrigin, .usesFontLeading]
Run Code Online (Sandbox Code Playgroud)

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

let options: NSStringDrawingOptions = [.UsesLineFragmentOrigin, .UsesFontLeading]
Run Code Online (Sandbox Code Playgroud)

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

修改NSStringDrawingOptions[struct]

  • 从: enum NSStringDrawingOptions : Int
  • 至: struct NSStringDrawingOptions : RawOptionSetType

你现在可以写:

let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading
Run Code Online (Sandbox Code Playgroud)

经过一些研究和@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)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 但是,在iOS 8 SDK中(在当前种子中),有一个错误,其中NSStringDrawingOptions移植到Swift enum : Int而不是struct : RawOptionSet.你应该向Apple发送一个错误报告来描述这个严重的问题.


Ale*_*tyy 21

更新了Xcode 6.3的答案:

在Xcode 6.3 Beta(Swift 1.2)中,这是最终修复的,你现在可以这样做:

let boundingRect = "string".boundingRectWithSize(size, options: .UsesLineFragmentOrigin | .UsesFontLeading, attributes:nil, context:nil)
Run Code Online (Sandbox Code Playgroud)

对于旧版本:

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

+ (NSStringDrawingOptions)combine:(NSStringDrawingOptions)option1 with:(NSStringDrawingOptions)option2
{
    return option1 | option2;
}
Run Code Online (Sandbox Code Playgroud)

和调用形式Swift:

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

  • 令人惊讶的是,这个bug仍然存在(iOS 8.1,Xcode 6.1GM2). (7认同)

kis*_*umi 7

另一种解决方案,使用unsafeBitCast.

如下所示:

let options = unsafeBitCast(NSStringDrawingOptions.UsesLineFragmentOrigin.rawValue | 
                            NSStringDrawingOptions.UsesFontLeading.rawValue,
                            NSStringDrawingOptions.self)
Run Code Online (Sandbox Code Playgroud)