How to pass multiple enum values as a function parameter

后端 未结 8 1533
余生分开走
余生分开走 2020-11-29 10:04

How would I do the following - passing two NSStringDrawing options as a function parameter in swift:

CGRect boundingRect = [string boundingRectWithSize:CGSiz         


        
相关标签:
8条回答
  • 2020-11-29 10:26

    Swift supports C's bitwise OR operator, but the enum's values are now in a specific scope instead of simply being global symbols:

    let boundingRect = "fpp".boundingRectWithSize(CGSizeMake(280.0, CGFloat.max),
        options:NSStringDrawingOptions.UsesLineFragmentOrigin | NSStringDrawingOptions.UsesFontLeading,
        attributes:nil, context:nil)
    
    0 讨论(0)
  • 2020-11-29 10:27

    Edit: In Swift 3.0:

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

    Edit: This is how you would use the options enum in Swift 2.0:

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

    Edit: The issue has been resolved in iOS 8.3 SDK Beta 1 (12F5027d):

    Modified NSStringDrawingOptions [struct]

    • From: enum NSStringDrawingOptions : Int
    • To: struct NSStringDrawingOptions : RawOptionSetType

    You can now write:

    let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading
    

    After some research and and @Anton Tcholakov's "comment":

    1. If you're targeting OS X 10.10, this is as simple way to do it:

      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. However, in iOS 8 SDK (in the current seed), there's a bug, where NSStringDrawingOptions is ported to Swift as enum : Int, instead of struct : RawOptionSet. You should send a bug report to Apple describing this serious problem.

    0 讨论(0)
  • 2020-11-29 10:27

    In Swift 2.1 we may use,

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

    to pass multiple enum values for a parameter.

    0 讨论(0)
  • 2020-11-29 10:35

    Can't seem to comment to akashivskyy's post (not got 50+ reputation), but this seems to work on my end:

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

    Also if I Cmd+click NSStringDrawingOptions I see it as inheriting from RawOptionSet.

    0 讨论(0)
  • 2020-11-29 10:40

    In swift 4.0+ we can pass multiple options like this, its working for me

    let options = NSStringDrawingOptions(rawValue: NSStringDrawingOptions.usesLineFragmentOrigin.rawValue | NSStringDrawingOptions.usesFontLeading.rawValue)
    
    let boundingRect = string._bridgeToObjectiveC().boundingRect(with: CGSize(width: 280, height: Int.max), options: options, attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 19.0)], context: nil)
    
    0 讨论(0)
  • 2020-11-29 10:42

    Updated answer for Xcode 6.3:

    in Xcode 6.3 Beta (Swift 1.2) this is finally fixed, you can do it now like this:

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

    For old version:

    It looks like a bug in current beta, for now I write Objective-C method and use it from Swift:

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

    and call form Swift:

    let boundingRect = "string".boundingRectWithSize(size, options: StringDrawingOptions.combine(.UsesLineFragmentOrigin, with: .UsesFontLeading), attributes:nil, context:nil)
    
    0 讨论(0)
提交回复
热议问题